asyncio动态添加任务

匿名 (未验证) 提交于 2019-12-03 00:15:02

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) 

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!