在 Python 中将互斥锁与并发期货一起使用

Using mutexes with concurrent futures in Python

我有一些代码使用并发 futures 连接到许多远程主机以执行 运行 一些命令。

例如:

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 个期货不应该同时 运行。我将如何编写代码?

这可以通过锁的字典来完成,使用下面的代码。

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

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

我不确定是否需要主锁,但这似乎可行。