生成器的應用:實現多工
import time
def task_1():
while true:
print('-----1-------')
time.sleep(0.1)
yield
def task_2():
while true:
print('-------2---------')
time.sleep(0.1)
yield
# task_1()
# task_2()
def main():
t1 = task_1()
t2 = task_2()
"""類似於兩個while true一起執行
先讓t1執行一會,當t1遇到yield的時候,再返回到18行
然後執行t2,當它遇到yield的時候,再次切換到t1中
這樣t1/t2/t1/t2的交替執行,最終實現了多工---->協程
"""while true:
next(t1)
next(t2)
main()
並行(真的):有兩個任務,兩個cpu,乙個任務佔乙個cpu
併發(假的):有四個任務,兩個cpu,四個任務交替占有cpu執行
yield實現單執行緒併發
import time
def consumer(name):
print('%s 準備學習了~' %(name))
while true:
lesson = yield
print('開始[%s]了,[%s]老師來講課了~' %(lesson,name))
def producer(name):
c1 = consumer('a')
c2 = consumer('b')
c1.__next__()
c2.__next__()
print('同學們開始上課了~')
for i in range(10):
time.sleep(1)
print('到了兩個同學')
c1.send(i)
c2.send(i)
producer('westos')
利用了關鍵字yield一次性返回乙個結果,阻塞,重新開始
send 喚醒
使用greenlet完成多工
為了更好的使用協程來完成多工,python中的greeblet模組
對其進行的封裝
pip3 install greenlet
「」"
from greenlet import greenlet
import time
def test1():
while true:
print('---a----')
gr2.switch()
time.sleep(0.5)
def test2():
while true:
print('----b----')
gr1.switch()
time.sleep(0.5)
"""greenlet這個類對yield進行的封裝
"""gr1= greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()
同樣的還有gevent模組
import gevent
def f1(n):
for i in range(n):
print(gevent.getcurrent(),i)
gevent.sleep(0.5)
def f2(n):
for i in range(n):
print(gevent.getcurrent(),i)
gevent.sleep(0.5)
def f3(n):
for i in range(n):
print(gevent.getcurrent(),i)
#gevent.sleep(0.5)
g1 = gevent.spawn(f1,5)
g2 = gevent.spawn(f2,5)
g3 = gevent.spawn(f3,5)
g1.join()
g2.join()
g3.join()
python中生成器
生成器 生成器generator 生成器函式generator m i for i in range 5 定義乙個生成器 print type m 判斷m的型別,是乙個生成器 print next m 使用next函式 def inc 定義乙個inc函式 for i in range 5 yield...
python中生成器yield
def yield demo for x in range 3 yield x print 生成器後一行 a yield demo print a 這裡的a是乙個生成器物件 可以用for迴圈來遍歷生成器物件裡的元素 for i in a print i 那麼yield的工作過程是怎麼樣的呢?可以通過...
python中生成器的使用
在python中我們常聽到迭代器和生成器,但是本人分開來介紹,只為告訴大家迭代器和生成器不是乙個東西,在上篇文章中我們詳細的介紹過迭代器和可迭代物件,本章重點介紹生成器。對於呼叫乙個普通的python函式,一般是從函式的第一行 開始執行,結束於return語句 異常或者函式所有語句執行完畢。一旦函式...