Использование мьютексов с параллельными фьючерсами в Python - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть некоторый код, который использует параллельные фьючерсы для подключения к множеству удаленных хостов для запуска некоторых команд.

Например:

def set_host_to(host, value):
  connection = connect_to(host)
  info = do_something_with(connection)
  do_some_action(connection, value)

with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
  for host, value in things_to_do:
    executor.submit(set_host_to, host, value)

Теперь у меня есть требование, чтобы некоторые из этих фьючерсов не работают в одно и то же время, но какие из них не могут быть обнаружены, пока они не получат info выше.

Является ли правильное решение своего рода мьютексами здесь? Скажем, info (или его часть) была строкой, и 2 фьючерса с одной и той же строкой не должны запускаться одновременно. Как бы я go о кодировании этого?

1 Ответ

1 голос
/ 05 марта 2020

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

locks = defaultdict(threading.Lock)
main_lock = threading.Lock() 

with main_lock:
    lock = locks[info]
with lock:
    do_some_action(connection, value)

Я не уверен, нужна ли основная блокировка, но, похоже, это работает.

...