3、协程
微线程,由程序员调度,线程是由CPU调度的
3.1 实现协程
import time
def work1():
for i in range(5):
print('work1',i)
yield
time.sleep(1)
def work2():
for i in range(5):
print('work2',i)
yield
time.sleep(1)
w1 = work1()
w2 = work2()
while True:
next(w1)
next(w2)
注意点:
利用yield这个属性,遇到yield会暂停执行,完成任务的切换
from greenlet import greenlet
import time
def work1():
for i in range(5):
print('work1',i)
g2.switch()
print('###已经切换了g2###')
time.sleep(1)
def work2():
for i in range(5):
print('work2',i)
g1.switch()
time.sleep(1)
g1 = greenlet(work1)
print(g1)
g2 = greenlet(work2)
print(g2)
g1.switch()
注意点:
需要手动切换协程
但是已经封装了协程了,比原始版本进化一点
import gevent
import time
from gevent import monkey
# 给耗时操作打补丁
monkey.patch_all()
def work1():
for i in range(5):
print('work1',i,gevent.getcurrent())
time.sleep(1)
# gevent.sleep(1)
def work2():
for i in range(5):
print('work2',i,gevent.getcurrent())
time.sleep(1)
# gevent.sleep(1)
# g1 = gevent.spawn(work1)
# g2 = gevent.spawn(work2)
#
# g1.join()
# g2.join()
gevent.joinall([
gevent.spawn(work1),
gevent.spawn(work2)
])
展示:
work1 0 <Greenlet at 0x57f1540: work1>
work2 0 <Greenlet at 0x57f1780: work2>
work1 1 <Greenlet at 0x57f1540: work1>
work2 1 <Greenlet at 0x57f1780: work2>
work1 2 <Greenlet at 0x57f1540: work1>
work2 2 <Greenlet at 0x57f1780: work2>
work1 3 <Greenlet at 0x57f1540: work1>
work2 3 <Greenlet at 0x57f1780: work2>
work1 4 <Greenlet at 0x57f1540: work1>
work2 4 <Greenlet at 0x57f1780: work2>