python協程之動態新增任務

2021-08-17 19:10:54 字數 1098 閱讀 9933

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

執行結果:

import asyncio

from threading import thread

async def production_task():

i = 0

while true:

asyncio.run_coroutine_threadsafe(consumption(i),

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

i += 1

async def consumption(i):

while true:

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

await asyncio.sleep(1)

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

多工 協程之生成器

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

練習PYTHON協程之GREENLET

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