#19.2 golang Синхронизация работы горутин через WaitGroup, объединение в группы

Для синхронизации выполнения горутин в Go имеется пакет sync, в нем в частности, определена стандартная структура sync.WaitGroup.

Тип sync.WaitGroup позволяет объединять горутины в группы и установливать блокировку, которая приостановит выполнение родительской (по отношению к вызванным горутинам функции) функции, пока не завершит выполнение вся группа горутин.

Рассмотрим пример кода:

Завершение дополнительных фоновых горутин сразу после завершения основной main() - Как это работает

Да, после завершения основной горутины из main() другие тоже завершаются превентивно (условно "немедленно").

Демонстрация в коде

Это можно продемонстрировать на примере кода:

Состояние гонки (race condition), конкуренция - что это в Программировании

Состояние гонки - проблема непредсказуемости результатов работы программы, возникающая в случае параллельного выполнения кода с доступом к общему ресурсу, когда реальное финальное и/или все промежуточные состояния этого ресурса нельзя точно предсказать из-за того, что последовательность выполнения операций над этим ресурсом не определена.

Параллельное выполнение - многопоточность, многоцессорность - что это

Параллельное выполнение - способность современных компьютеров условно параллельно (на уровне концепции в архитектуре ОС) или еще и действительно параллельно (на уровне архитектуры центрального процессора) выполнять "одновременно" (условно или реально) код разных программ.

Операционные системы, которые поддерживают такое выполнение, обычно оперируют используют процессы/потоки

golang Поиск пересечений списков отрезков времени

У нас есть два списка отрезков упорядоченных отрезков "времени" вида:

1) [1, 5] [7, 10]
2) [2, 8] [9, 12] [13, 15]

-- требуется найти список пересечений этих отрезков, напр. в данном случае ответ будет:

[2, 5] [7, 8] [9, 10]

Возможная визуализация:

--------   ---     --------- --------
  ---   ---   ---       ------    -----  -------- -----       ------

Общая идея решения (алгоритм)

Будем действовать так:

audacity Зависает при редактировании метаданных - linux

Зависает если начать редактировать метаданные файла (mp3)

Возможное решение

Прежде чем делать экспорт файла - сохраните проект (особенно если перед этим было восстановление из recover project)

В моем случае это помогло с версией 3.3.7 на ubuntu 22.04

На мысль навели эти вопросы:

You saved a Project or Audacity keeps recovering the show from its crash tools?

If you’re using the crash tools, can you save a Project?

vscode vscodium launch.json console property Переключаемся на обычный терминал вместо debug console

В разделе configurations для конкретной конфигурации используйте например:

"console": "integratedTerminal",

Пример для golang:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch Package",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${fileDirname}",
            "console": "integratedTerminal",
        }
    ]
}

vscode vscodium - Unable to process `evaluate`: debuggee is running Ошибка

Unable to process `evaluate`: debuggee is running

У vscode есть какие-то проблемы с поддержкой tty, для решения проблемы мы можно добавить в конфигурацию использование стандартног терминала вместо debug console

Утиная типизация (duck typing) - что это в программировании

Утиная типизация (duck typing) — шуточный темин, описывающий реальную ситуацию, а именно:
- это концепция в программировании, при которой совместимость типов определяется не наследованием, а наличием необходимых методов и свойств у объекта во время выполнения.

Почему "утиная"

Название термина пошло от английского «duck test» («утиный тест»), суть которого выражается как:

Если нечто выглядит, как утка, плавает, как утка, и крякает, как утка, то это, вероятно, и есть утка.

#20.1 golang Каналы - с буфером и без, состояние блокировки, взаимоблокировки deadlock

Каналы (chan) — это типизированные очереди (FIFO), которые позволяют горутинам обмениваться данными без явных блокировок.

В языке Go канал имеет определенный тип, то есть тип значений, которые он может передавать из одной горутины в другую. Для определения канала применяется ключевое слово chan:

chan тип_элемента

-- фактически так объявляется что-то вподе составного типа, т.е. на пример "канал целых чисел".

Ниже мы посмотрим как это работает в коде.

Pages

Subscribe to fkn+antitotal RSS