gpt4 book ai didi

python - 从另一个线程调度异步协程

转载 作者:太空狗 更新时间:2023-10-30 00:31:30 25 4
gpt4 key购买 nike

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

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

  1. @wind85 回答:直接用 asyncio.run_coroutine_threadsafe(coroutine(), event_loop) 调用替换 create_task 行调用。需要 Python 3.5.1。

  2. 使用 call_soon_threadsafe 安排回调,然后创建任务:

    def do_create_task():
    eventLoop.create_task(coroutine())

    def scheduler():
    eventLoop.call_soon_threadsafe(do_create_task)

关于python - 从另一个线程调度异步协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37841222/

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