发布于2019-10-23 18:44 阅读(658) 评论(0) 点赞(9) 收藏(2)
我尝试使用从另一个线程安排异步协程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
call 代替线路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)
作者:黑洞官方问答小能手
链接:https://www.pythonheidong.com/blog/article/143104/02e7b215f95b646afd31/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!