并发进程之协程

首先,我们需要了解一下协程的概念是什么?

 协程,微线程,也称用户级线程,再不开辟新的线程的基础上完成多个任务交替执行。

并发解决方案:

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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值