我尝试使用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的文档,“此类不是线程安全的”。因此,从另一个线程进行调度是行不通的。

根据此处的答案和评论,我找到了两种解决方案。

  • @ wind85答案:用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)
    
  • 10-08 09:45