我尝试使用create_task()
从另一个线程安排异步协程。问题在于,协程至少在合理的时间内没有被调用。
有什么方法可以唤醒事件循环或至少指定较短的超时时间?
#!/usr/bin/python3
import asyncio, threading
event_loop = None
@asyncio.coroutine
def coroutine():
print("coroutine called")
def scheduler():
print("scheduling...")
event_loop.create_task(coroutine())
threading.Timer(2, scheduler).start()
def main():
global event_loop
threading.Timer(2, scheduler).start()
event_loop = asyncio.new_event_loop()
asyncio.set_event_loop(event_loop)
event_loop.run_forever()
main()
输出:
scheduling...
scheduling...
scheduling...
scheduling...
最佳答案
根据Task的文档,“此类不是线程安全的”。因此,从另一个线程进行调度是行不通的。
根据此处的答案和评论,我找到了两种解决方案。
create_task
调用直接替换asyncio.run_coroutine_threadsafe(coroutine(), event_loop)
线调用。需要Python 3.5.1。 call_soon_threadsafe
安排回调,然后创建任务:def do_create_task():
eventLoop.create_task(coroutine())
def scheduler():
eventLoop.call_soon_threadsafe(do_create_task)