asyncio動態新增任務

2022-05-23 02:45:09 字數 1489 閱讀 8445

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)

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...