Python 多工(協程) day1

2022-08-21 23:18:19 字數 1967 閱讀 1847

比執行緒所需的資源更少

可以用yield 實現多工,其實是併發,但速度很快,相當於同時進行

import time

def test1():

while true:

print('——1——')

yield

def test2():

while true:

print('——2——')

yield

def main():

t1= test1()

t2= test2()

while true:

next(t1)

next(t2)

if __name__ == '__main__':

main()

可以用 greenlet 來執行, greenlet 其實對yield的更高階封裝

import time

import greenlet

def test1():

while true:

print("——1——")

g2.switch()

def test2():

while true:

print("——2——")

g1.switch()

g1= greenlet.greenlet(test1)

g2= greenlet.greenlet(test2)

g1.switch()

雖然 greenlet 也可以實現多工,但還是用 gevent ,因為如果用 greenlet ,函式裡如果延時,那麼下個指令就不會執行,但 gevent 遇到延時時會自己切換任務,而且是自己的延時  gevent.sleep()

但是如果已經寫好了實在不想換,在最前面加 monkey.patch_all() 這樣就可以用 time.sleep() 了,不過要在前面from gevent import monkey,不能單純的匯入gevent 不然會報錯

到最後依然需要用 join來等待結束,但可以用joinall(列表)來代替每乙個join

import gevent

import time

from gevent import monkey

monkey.patch_all()

def f1(n):

for i in range(n):

print(gevent.getcurrent(),i)

time.sleep(0.5) # 在寫入monkey.patch_all()後 可以代替geven.sleep()

# gevent.sleep(0.5)

def f2(n):

for i in range(n):

print(gevent.getcurrent(),i)

time.sleep(0.5)

# gevent.sleep(0.5)

def f3(n):

for i in range(n):

print(gevent.getcurrent(),i)

time.sleep(0.5)

# gevent.sleep(0.5)

print("——1——")

g1 = gevent.spawn(f1,5)

print("——2——")

g2 = gevent.spawn(f2,5)

print("——3——")

g3 = gevent.spawn(f3,5)

# g1.join() 可以用joinall代替

# g2.join()

# g3.join()

gevent.joinall([

gevent.spawn(f1,5),

gevent.spawn(f2,5),

gevent.spawn(f3,5),

])

Python 多工 協程

高階程式設計技巧 學習筆記 1.1 同步 非同步 1.2 阻塞 非阻塞 2.1 什麼是協程?協程,又稱微執行緒。協程是 python 個中另外一種實現多工的方式,只不過比執行緒更小占用更小執行單元 理解為需要的資源 2.2 python中的協程大概經歷了如下三個階段 最初的生成器變形yield se...

Python 多工 執行緒 day1

多工就是可以讓一台電腦同時執行多個命令。以前的單核cpu是怎麼做到同時執行多個命令的?時間片輪轉 其實以前的單核cpu是讓作業系統交替執行命令,每個任務執行0.01秒,這樣看起來就像是在同時執行多個命令。就跟手翻動畫一樣。並行 真的多工 併發 假的多工 執行緒 乙個程式執行,一定有乙個執行 的東西,...

多工 協程

示例 import time defwork1 while true print 正在掃地 yield defwork2 while true print 正在搬磚 yield w1 work1 w2 work2 協程肯定是併發執行 while true next w1 next w2 greenl...