python協程執行阻塞機制的坑

2021-09-27 07:49:25 字數 2372 閱讀 5853

廢話不多說,直接看兩段**:

# 阻塞

import random

import gevent

import time

import gevent.monkey

gevent.monkey.patch_all()

# 自動切換 若沒有這行**,若sleep則會順序執行:小明1-3,小紅1-3,小剛1-3實現協程

# 需要等待時,自動切換。使得sleep程式執行方式相當於gevent.sleep(random.randint(1,5))。

def show_wait(name, num):

for i in range(num):

waiting = random.randint(1,5)

print(i,"->",name, "wait for",waiting, "seconds")

# gevent.sleep(waiting) # 不需要等待就順序執行,需要等待,自動切換

time.sleep(random.randint(1, 5)) # time.sleep就相當於順序執行(這是程式sleep,不是協程等待)。

print(i,"->",name,"over")

if __name__ == '__main__':

g1 = gevent.spawn(show_wait, "小明", 3).join()

g2 = gevent.spawn(show_wait, "小紅", 3).join()

g3 = gevent.spawn(show_wait, "小剛", 3).join()

# for i in ['小明','小紅','小剛']:

# g = gevent.spawn(show_wait,i,3).join()

非阻塞:

# 非阻塞

import random

import gevent

import time

import gevent.monkey

gevent.monkey.patch_all()

# 自動切換 若沒有這行**,若sleep則會順序執行:小明1-3,小紅1-3,小剛1-3實現協程

# 需要等待時,自動切換。使得sleep程式執行方式相當於gevent.sleep(random.randint(1,5))。

def show_wait(name, num):

for i in range(num):

waiting = random.randint(1,5)

print(i,"->",name, "wait for",waiting, "seconds")

gevent.sleep(waiting) # 不需要等待就順序執行,需要等待,自動切換

# time.sleep(waiting) # time.sleep就相當於順序執行(這是程式sleep,不是協程等待)。

print(i,"->",name,"over")

if __name__ == '__main__':

g1 = gevent.spawn(show_wait, "小明", 3)

g2 = gevent.spawn(show_wait, "小紅", 3)

g3 = gevent.spawn(show_wait, "小剛", 3)

g1.join()

g2.join()

g3.join()

對比區別地方:

# 非阻塞

g1 = gevent.spawn(show_wait, "小明", 3)

g2 = gevent.spawn(show_wait, "小紅", 3)

g3 = gevent.spawn(show_wait, "小剛", 3)

g1.join()

g2.join()

g3.join()

#阻塞g1 = gevent.spawn(show_wait, "小明", 3).join()

g2 = gevent.spawn(show_wait, "小紅", 3).join()

g3 = gevent.spawn(show_wait, "小剛", 3).join()

結論:協程的建立和join要分開,否則就會阻塞。

1,協程自動排程[gevent.monkey.patch_all()或等待時使用gevent.sleep(random)]

2,協程的建立和join(分配)要分開,方法例如:

gevents =

for pages in pages_lists:# 協程建立

for g in gevents:# 協程join(分配)

g.join()

Python協程 三 Asyncio執行

asyncio.run coro,debug false 執行 coroutine coro 並返回結果。此函式執行傳入的協程,負責管理 asyncio 事件迴圈並完結非同步生成器。當有其他 asyncio 事件迴圈在同一執行緒中執行時,此函式不能被呼叫。如果 debug 為true,事件迴圈將以除...

python協程使用 協程的案例

概念 使用者層面在乙個執行緒中進行多工切換的機制,比執行緒更加輕量級 實現併發量更大 協程的使用 使用第三方庫 gevent gevent 是乙個基於協程的 python 網路庫,在遇到 io 阻塞時,程式會自動進行切換,可以讓我們用同步的放肆寫非同步 io 協程的使用 from gevent im...

協程中呼叫阻塞函式

from concurrent.futures import threadpoolexecutor from tornado import gen threadpool threadpoolexecutor 2 def mysleep count import time for i in range...