gpt4 book ai didi

python - 如何以非阻塞方式链接 future ?即,如何在不阻塞的情况下将一个 future 作为另一个 future 的输入?

转载 作者:太空狗 更新时间:2023-10-29 20:28:57 32 4
gpt4 key购买 nike

使用下面的示例,future2 如何在 future1 完成后使用 future1 的结果(不阻塞 future3 从被提交)?

from concurrent.futures import ProcessPoolExecutor
import time

def wait(seconds):
time.sleep(seconds)
return seconds

pool = ProcessPoolExecutor()

s = time.time()
future1 = pool.submit(wait, 5)
future2 = pool.submit(wait, future1.result())
future3 = pool.submit(wait, 10)

time_taken = time.time() - s
print(time_taken)

最佳答案

这可以通过精心设计回调以在第一个操作完成后提交第二个操作来实现。遗憾的是,不可能将任意 future 传递给 pool.submit,因此需要一个额外的步骤将两个 future 绑定(bind)在一起。

这是一个可能的实现:

import concurrent.futures

def copy_future_state(source, destination):
if source.cancelled():
destination.cancel()
if not destination.set_running_or_notify_cancel():
return
exception = source.exception()
if exception is not None:
destination.set_exception(exception)
else:
result = source.result()
destination.set_result(result)


def chain(pool, future, fn):
result = concurrent.futures.Future()

def callback(_):
try:
temp = pool.submit(fn, future.result())
copy = lambda _: copy_future_state(temp, result)
temp.add_done_callback(copy)
except:
result.cancel()
raise

future.add_done_callback(callback)
return result

请注意,copy_future_stateasyncio.futures._set_concurrent_future_state 的略微修改版本.

用法:

from concurrent.futures import ProcessPoolExecutor

def wait(seconds):
time.sleep(seconds)
return seconds

pool = ProcessPoolExecutor()
future1 = pool.submit(wait, 5)
future2 = chain(pool, future1, wait)
future3 = pool.submit(wait, 10)

关于python - 如何以非阻塞方式链接 future ?即,如何在不阻塞的情况下将一个 future 作为另一个 future 的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45922846/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com