gpt4 book ai didi

python - 异步等待方法在 Python 3 中完成

转载 作者:行者123 更新时间:2023-11-28 17:57:49 31 4
gpt4 key购买 nike

考虑这个简化的例子:

def get_external_thing() -> str:
my_variable = a_blocking_operation()
my_variable.some_other_operation()
return my_variable

externally_gathered_thing = None
while True:
sleep(1)
externally_gathered_thing = get_external_thing()
if externally_gathered_thing:
do_something_1()
externally_gathered_thing = None
do_something_2()

这显然会进入循环,休眠一秒钟,然后进入get_external_thing(),等待a_blocking_operation()完成。只要 get_external_thing() 正在运行,就不会执行任何其他操作。

我想要完成的是,如果 get_external_thing() 未完成并直接转到 do_something_2(),则强制我的循环继续。但是,如果 get_external_thing() 完成并且 externally_gathered_thing 有一些值,我希望 do_something_1() 也被执行。

我怎样才能完全用 Python 完成它?我尝试使用此示例来学习 asyncio,但未能生成任何有效示例。由于项目要求,asyncio 是首选,但不是必须的。

换句话说,无论 get_external_thing().

注意:不要被 while True 构造吓到,它被设计为在树莓派上连续运行:)

最佳答案

对于此类任务,请查看 concurrent.futures模块。例如:

def get_external_thing() -> str:
my_variable = a_blocking_operation()
my_variable.some_other_operation()
return my_variable

externally_gathered_thing = None
executor = concurrent.futures.ThreadPoolExecutor()
working = None

while True:
if working is None:
# if no work is in progress, start the external task in a bg thread
working = executor.submit(get_external_thing)
try:
# wait for the external result, but no more than a second
externally_gathered_thing = working.result(timeout=1)
working = None
except concurrent.futures.TimeoutError:
# in case of timeout, proceed with our logic anyway, we'll get
# back to waiting in the next iteration
pass

if externally_gathered_thing is not None:
do_something_1()
externally_gathered_thing = None
do_something_2()

基于 asyncio 的解决方案是可能的,但它仍然必须在引擎盖下使用线程来等待阻塞操作(这就是 run_in_executor 的工作方式),因此它将 asyncio 的复杂性与线程的复杂性结合起来。

关于python - 异步等待方法在 Python 3 中完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57323382/

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