zoukankan      html  css  js  c++  java
  • asyncio动态添加任务

    asyncio.run_forever()下动态添加任务

    方法一、asyncio.run_coroutine_threadsafe(coroutine, loop)

    方法二、asyncio.call_soon_threadsafe(callback, *args, context=None)

    方法一、实例run_coroutine_threadsafe

    通过添加新的coroutin对象,放入loop内,动态添加。(爬虫正解)

    import asyncio
    import time
    
    from threading import Thread
    
    
    def start_loop(loop):
        asyncio.set_event_loop(loop)
        print("start loop", time.time())
        loop.run_forever()
    
    
    async def do_some_work(x):
        print('start {}'.format(x))
        await asyncio.sleep(x)
        print('Done after {}s'.format(x))
    
    
    new_loop = asyncio.new_event_loop()
    t = Thread(target=start_loop, args=(new_loop,))
    t.start()
    
    asyncio.run_coroutine_threadsafe(do_some_work(6), new_loop)
    asyncio.run_coroutine_threadsafe(do_some_work(4), new_loop)
    

      

    方法二、实例call_soon_threadsafe

    如果是io操作,就会相当于变成线程去阻塞执行添加进去的函数,密集型则没关系。

    import asyncio
    import time
    from threading import Thread
    
    
    def start_loop(loop):
        asyncio.set_event_loop(loop)
        print("start loop")
        loop.run_forever()
    
    
    def more_work(x):
        print('start work {}'.format(x))
        time.sleep(x)
        print('Finished work {}'.format(x))
    
    
    new_loop = asyncio.new_event_loop()
    t = Thread(target=start_loop, args=(new_loop,))
    t.start()
    
    new_loop.call_soon_threadsafe(more_work, 6)
    new_loop.call_soon_threadsafe(more_work, 3)
    

      

  • 相关阅读:
    php 日期处理 DateTime
    http范围请求
    fiddle扩展
    汉字编码 (GB2312 GBK GB18030)
    Navicat http 通道增加验证
    vim 支持 nginx配置文件 语法高亮
    composer 使用
    剖析nsq消息队列(三) 消息传输的可靠性和持久化[一]
    剖析nsq消息队列(二) 去中心化源码解析
    剖析nsq消息队列(一) 简介及去中心化实现原理
  • 原文地址:https://www.cnblogs.com/7134g/p/11730025.html
Copyright © 2011-2022 走看看