gpt4 book ai didi

python - 我应该如何在不干扰其他调用者的情况下在库中使用 asyncio?

转载 作者:行者123 更新时间:2023-11-28 17:33:52 25 4
gpt4 key购买 nike

我想写一个库,用 asyncio 管理子进程。我不想强制我的调用者自己异步,所以我宁愿得到一个 new_event_loop ,做一个run_until_complete , 然后 close它。理想情况下,我希望在不与调用者可能正在执行的任何其他异步操作冲突的情况下执行此操作。

我的问题是等待子进程不起作用,除非你调用 set_event_loop , 它附加了内部观察者。但当然,如果我这样做,我可能会与调用者中的其他事件循环发生冲突。解决方法是缓存调用者的当前循环(如果有),然后调用 set_event_loop当我完成恢复来电者的状态时再进行一次。这几乎行得通。但是如果调用者不是 asyncio 用户,调用 get_event_loop 的副作用是我现在创建了一个以前不存在的全局循环,如果程序在没有调用 close 的情况下退出,Python 将打印一个可怕的警告。在那个循环上。

我能想到的唯一元解决方法是执行 atexit.register关闭全局循环的回调。这不会与调用者发生冲突,因为 close 可以安全地多次调用,除非调用者做了一些疯狂的事情,比如在退出期间尝试启动全局循环。所以它仍然不完美。

有没有完美的解决方案?

最佳答案

您要实现的目标看起来非常像 ProcessPoolExecutor (在 concurrent.futures 中)。

异步调用者:

@coroutine
def in_process(callback, *args, executor=ProcessPoolExecutor()):
loop = get_event_loop()
result = yield from loop.run_in_executor(executor, callback, *args)
return result

同步调用者:

with ProcessPoolExecutor() as executor:
future = executor.submit(callback, *args)
result = future.result()

关于python - 我应该如何在不干扰其他调用者的情况下在库中使用 asyncio?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32345735/

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