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