首先,我们需要了解一下协程的概念是什么?
协程,微线程,也称用户级线程,再不开辟新的线程的基础上完成多个任务交替执行。
并发解决方案:
import time
def work1():
while True:
print("work1----")
time.sleep(1)
yield #能让函数暂停也能启动函数
def work2():
while True:
print("work2----")
time.sleep(1)
yield
def main():
y1 = work1()
y2 = work2()
while True:
next(y1)
next(y2)
main()
上题总结: 先让y1运行,当y1遇到yield的时候,程序会暂停,返回while True 执行y2的内容, 当y2又碰到yield就会切换到y1,就这样交替执行 y1/y2/y1/y2...
协程的常见
import time
import greenlet
# greenlet底层封装的就是yield
def work1():
for i in range(5):
print("你就是个勾八")
time.sleep(1)
g2.switch() # 切换到g2
def work2():
for i in range(5):
print("哈哈哈")
time.sleep(1)
g1.switch() # 再切换到g1
g1 = greenlet.greenlet(work1)
g2 = greenlet.greenlet(work2)
g1.switch() #启动g1
小结: greenlet特点:greenlet已经能够实现协程的操作,但是切换还需要手动切换,比较麻烦
打补丁
import gevent
import time
# 打补丁 #加了打补丁这句话就可以使用time.sleep()否则就得使用gevent.sleep()
from gevent import monkey
monkey.patch_all()
def work1():
for i in range(5):
# 获取当前协程对象
print("你就是个勾八",gevent.getcurrent(),i)
# gevent.sleep(1) #不需要time的延时,是自己模块的延时
time.sleep(1)
def work2():
for i in range(5):
print("哈哈哈",gevent.getcurrent(),i)
# gevent.sleep(1)
time.sleep(1)
# 创建协程
g1 = gevent.spawn(work1)
g2 = gevent.spawn(work2)
g1.join()
g2.join()
小结: 缺点:不能使用其他模块中的方法 解决方案: 打补丁--这句话要用在代码的上面 from gevent import monkey monkey.patch_all()