程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

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

发布于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的文档“此类不是线程安全的”。因此,从另一个线程进行调度不会起作用。

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

  1. @ wind85回答:直接用create_taskcall 代替线路asyncio.run_coroutine_threadsafe(coroutine(), event_loop)呼叫。需要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)


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/143104/02e7b215f95b646afd31/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

9 0
收藏该文
已收藏

评论内容:(最多支持255个字符)