python協程之動態新增任務的方法

2022-10-06 04:36:10 字數 1239 閱讀 3101

python協程只能執行在事件迴圈中,但是一旦事件迴圈執行,又會阻塞當前任務。所以只能在當前程序中再開乙個執行緒,這個執行緒的主要任務是執行事件迴圈,就是event_loop,因為他是乙個無限迴圈,會阻塞當前執行緒。程式設計客棧

放乙個自己寫的demo,注釋寫的很詳細。

另外還有一點需要注意,乙個事件迴圈中不能執行另外乙個事件迴圈。

執行結果:

impkgkovzupuort asyncio

from threading import thread

async def production_task():

i = 0

while true:

# 將consumption這個www.cppcns.com協程每秒註冊乙個到執行**程中的迴圈,thread_loop每秒會獲得乙個一直列印i的無限迴圈任務

asyncio.run_coroutine_threadsafe(consumption(i),

thread_loop) # 注意:run_coroutine_threadsafe程式設計客棧 這個方法只能用在執行**程中的迴圈事件使用

await asyncio.sleep(1) # 必須加await

i += 1

async def consumption(i):

while true:

print("我是第{}任務".format(i))

await asyncio.sleep(

def start_loop(loop):

# 執行事件迴圈, loop以引數的形式傳遞進來執行

asyncio.set_event_loop(loop)

loop.run_forever()

thread_loop = asyncio.new_event_loop() # 獲取乙個事件迴圈

run_loop_thread = thread(target=start_loop, args=(thread_loop,)) # 將次事件迴圈執行在乙個執行緒中,防止阻塞當前主線程

run_loop_thread.start() # 執行執行緒,同時協程事件迴圈也會執行

advocate_loop = asyncio.get_event_loop() # 將生產任務的協程註冊到這個迴圈中

advocate_loop.run_until_complete(production_task()) # 執行次迴圈

本文標題: python協程之動態新增任務的方法

本文位址:

python協程之動態新增任務

python協程只能執行在事件迴圈中,但是一旦事件迴圈執行,又會阻塞當前任務。所以只能在當前程序中再開乙個執行緒,這個執行緒的主要任務是執行事件迴圈,就是event loop,因為他是乙個無限迴圈,會阻塞當前執行緒。放乙個自己寫的demo,注釋寫的很詳細。另外還有一點需要注意,乙個事件迴圈中不能執行...

多工 協程之生成器

1.生成器的概念 利用迭代器,我們可以在每次迭代獲取資料 通過next 方法 時按照特定的規律進行生成。但是我們在實現乙個迭代器時,關於當前迭代到的狀態需要我們自己記錄,進而才能根據當前狀態生成下乙個資料。為了達到記錄當前狀態,並配合next 函式進行迭代使用,我們可以採用更簡便的語法,即生成器 g...

練習PYTHON協程之GREENLET

stackless就算了,了解一下原理即可。greenlet,gevent,eventlet這些,比較好測試,還是都 擼一次,得個印象。測試 都是網上的大路貨。from greenlet import greenlet deftest1 print 12gr2.switch print 34 def...