asyncio.run_forever()下動態新增任務
方法一、asyncio.run_coroutine_threadsafe(coroutine, loop)
方法二、asyncio.call_soon_threadsafe(callback, *args, context=none)
方法一、例項run_coroutine_threadsafe
通過新增新的coroutin物件,放入loop內,動態新增。(爬蟲正解)
import asyncioimport 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 asyncioimport 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)
asyncio 非同步任務
前言 python由於gil 全域性鎖 的存在,不能發揮多核的優勢,其效能一直飽受詬病。然而在io密集型的網路程式設計裡,非同步處理比同步處理能提公升成百上千倍的效率,彌補了python效能方面的短板,如最新的微服務框架japronto,resquests per second可達百萬級。pytho...
python協程之動態新增任務
python協程只能執行在事件迴圈中,但是一旦事件迴圈執行,又會阻塞當前任務。所以只能在當前程序中再開乙個執行緒,這個執行緒的主要任務是執行事件迴圈,就是event loop,因為他是乙個無限迴圈,會阻塞當前執行緒。放乙個自己寫的demo,注釋寫的很詳細。另外還有一點需要注意,乙個事件迴圈中不能執行...
spring boot動態新增 刪除定時任務
一 注入依賴 org.quartz scheduler quartz 2.2.1 slf4j api org.slf4j org.springframework spring context support 二 編寫執行任務 import org.jboss.logging.logger impor...