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)

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM