【发布时间】:2015-11-27 12:34:16
【问题描述】:
我想编写一个使用 asyncio 管理子进程的库。我不想强迫我的调用者自己异步,所以我更愿意得到一个new_event_loop,做一个run_until_complete,然后是close。理想情况下,我希望这样做不会与调用者可能正在做的任何其他异步操作发生冲突。
我的问题是等待子进程不起作用,除非你调用set_event_loop,它附加了内部观察者。但当然,如果我这样做,我可能会与调用者中的其他事件循环发生冲突。一种解决方法是缓存调用者的当前循环(如果有),然后在我完成恢复调用者的状态后再次调用set_event_loop。这几乎行得通。但是如果调用者不是 asyncio 用户,调用 get_event_loop 的副作用是我现在创建了一个以前不存在的全局循环,如果程序退出而不调用 @987654327,Python 将打印一个可怕的警告@ 在那个循环上。
我能想到的唯一元解决方法是执行一个关闭全局循环的atexit.register 回调。这不会与调用者发生冲突,因为 close 可以安全地多次调用,除非调用者做了一些疯狂的事情,比如在退出期间尝试启动全局循环。所以还是不完美。
有没有完美的解决方案?
【问题讨论】:
标签: python python-asyncio