Python学习-并发编程之协程
博客专区 > D7 的博客 > 博客详情
Python学习-并发编程之协程
D7 发表于5个月前
Python学习-并发编程之协程
  • 发表于 5个月前
  • 阅读 22
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

Python学习-并发编程之协程

协程的概述

协程就是是单线程下的并发,又称微线程,纤程,英文名Coroutine。一句话说明什么是协程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。为什么要用协程?当一个线程中有多个任务在处理的过程中会产生IO时,那么此时PIL锁会被其它线程抢走,而此线程会出现阻塞。解决这个问题的办法就是将线程中出现大量IO的任务用协程来处理,由用户来控制当其中一个任务出现IO阻塞时,立马切换另一个任务来执行,这个操作对于PIL锁是不知的,这种方法就是单线程中的多协程并发。

创建协程

创建协程需要用到第三方gevent模块,gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。

#pip3 install gevent			# 安装gevent模块

注意:gevent默认是不能识别除它自己支持以外的其它阻塞类型,如果要想支持其它阻塞类型需要用到gevent的monkey模块的patch_all()方法,并且这个方法必须用在被打补丁的模块前面。

# 创建多个携程
from gevent import monkey;monkey.patch_all()	# 一定要用在前面
import gevent
import time, random


def Calculation(i, value, count):		# 创建一个处理函数
    if value == 1:
        print("pid:%s count:%d" %(i, count))
        return count
    if value % 2 == 0:
        count += 1
        time.sleep(1)                   # 模拟执行时间
        value = value / 2
    else:
        value = value * 3 + 1
    return Calculation(i, value, count)

if __name__ == '__main__':
    G_List = []
    count = 0
    start = time.time()
    for i in range(10):
      	# 用gevent.spawn()方法创建携程,返回一个Greenlet类的实例
        G_List.append(gevent.spawn(Calculation, i, random.randint(i + 1, i + 10), count))
    # 协程也需要join,但协程有joinall()方法,接受列表方式的协程对象
    gevent.joinall(G_List)
    # 协程的返回值可以通过Greenlet类的value属性获取
    print([value.value for value in G_List])
    print(time.time()-start)		# 打印协程的执行时间
共有 人打赏支持
粉丝 0
博文 5
码字总数 5326
×
D7
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: