Синхронизация нескольких потоков в Python

Используйте itertools.cycle , чтобы перейти к началу L2:

from itertools import cycle
dict(zip(L1, cycle(L2)))
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}

В вашем случае объединение L2 с самим собой также работает.

# dict(zip(L1, L2 * 2))
dict(zip(L1, L2 + L2))
# {'A': '1', 'B': '2', 'C': '3', 'D': '1', 'E': '2'}

6
задан SilentGhost 20 May 2009 в 11:16
поделиться

2 ответа

Есть много способов синхронизировать потоки. Многие.

Помимо синхронизации, вы можете выполнять следующие действия.

  1. Разделите задачи на два этапа вокруг точки синхронизации. Запустите потоки, выполняющие этап предварительной синхронизации. Затем используйте "join", чтобы дождаться, пока все потоки завершат шаг 1. Запустите новые потоки, выполняющие шаг после синхронизации. Я предпочитаю это синхронизации.

  2. Создайте очередь; получить блокировку синхронизации. Запустить все темы. Каждый поток помещает запись в очередь и ожидает блокировки синхронизации. «Основной» поток находится в цикле, удаляя элементы из очереди. Когда все потоки поместили элемент в очередь, «основной» поток снимает блокировку синхронизации. Все остальные потоки теперь могут снова запускаться.

1
ответ дан 17 December 2019 в 04:51
поделиться

Требуемая функциональность называется « барьер ». (К сожалению, этот термин имеет два значения, когда речь идет о потоковой передаче. Так что, если вы Google его, просто игнорируйте статьи, в которых говорится о « барьерах памяти » - это совсем другое).

Ваш код выглядит вполне разумно - он прост и безопасен.

Я не смог найти «стандартных» реализаций барьеров для Python, поэтому предлагаю вам продолжать использовать ваш код.

2
ответ дан 17 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: