python中生成器的應用

2021-09-03 02:38:16 字數 2235 閱讀 2927

生成器的應用:實現多工

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語句 異常或者函式所有語句執行完畢。一旦函式...