在 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)
我不确定是否需要主锁,但这似乎可行。
我有一些代码使用并发 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)
我不确定是否需要主锁,但这似乎可行。