文档章节

Python学习-并发编程之协程

D7
 D7
发布于 2017/09/01 00:06
字数 586
阅读 27
收藏 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)		# 打印协程的执行时间

© 著作权归作者所有

共有 人打赏支持
D7

D7

粉丝 0
博文 5
码字总数 5326
作品 0
海淀
技术主管
私信 提问
python --- 协程编程(第三方库gevent的使用)

1. 什么是协程?   协程(coroutine),又称微线程。协程不是线程也不是进程,它的上下文关系切换不是由CPU控制,一个协程由当前任务切换到其他任务由当前任务来控制。一个线程可以包含多个...

码农47
2017/11/19
0
0
python 高性能编程之协程

用 greenlet 协程处理异步事件 自从 PyCon 2011 协程成为热点话题以来,我一直对此有着浓厚的兴趣。为了异步,我们曾使用多线程编程。然而线程在有着 GIL 的 Python 中带来的性能瓶颈和多线程...

passionfly
2015/05/07
0
0
Python 3.5 协程究竟是个啥

原文链接 : How the heck does async/await work in Python 3.5? 原文作者 : Brett Cannon 译文出自 : 掘金翻译计划 译者 : @Yushneng 校对者: @L9m,@iThreeKing 作者是 Python 语言的核心开...

好铁
2017/10/23
0
0
《Python分布式计算》第2章 异步编程 (Distributed Computing with Python)

序言 第1章 并行和分布式计算介绍 第2章 异步编程 第3章 Python的并行计算 第4章 Celery分布式应用 第5章 云平台部署Python 第6章 超级计算机群使用Python 第7章 测试和调试分布式应用 第8章...

seancheney
2017/10/11
0
0
【重要】基于Gevent的firefly重要迭代版本推出

目前使用者最多的开源游戏服务器端框架Firefly推出了基于Gevent的重要迭代版本,不过目前还处在alpha阶段。Firefly团队使用Gevent完整实现了之前Firefly所依赖twisted内的部分,并还原了api...

大鸡蛋
2014/03/20
3.1K
6

没有更多内容

加载失败,请刷新页面

加载更多

推荐转载连接

https://www.cnblogs.com/ysocean/p/7409779.html#_label0

小橙子的曼曼
36分钟前
0
0
雷军亲自打造的套餐了解下:用多少付多少

12月28日消息,小米科技创始人兼CEO雷军微博表示,小米移动任我行套餐方案,原则上就是明明白白消费,用多少付多少,不用不花钱!上网、电话和短信都是一毛钱,上网0.1元/M,电话0.1元/分钟,...

linuxCool
47分钟前
0
0
协议简史:如何学习网络协议?

大学时,学到网络协议的7层模型时,老师教了大家一个顺口溜:物数网传会表应。并说这是重点,年年必考,5分的题目摆在这里,你们爱背不背。 考试的时候,果然遇到这个问题,搜索枯肠,只能想...

Java干货分享
56分钟前
5
0
雷军亲自打造的套餐了解下:用多少付多少

12月28日消息,小米科技创始人兼CEO雷军微博表示,小米移动任我行套餐方案,原则上就是明明白白消费,用多少付多少,不用不花钱!上网、电话和短信都是一毛钱,上网0.1元/M,电话0.1元/分钟,...

linux-tao
今天
2
0
在 Ubuntu 上为 CentOS 编译 Rust 程序

现在 CentOS 8 还没出来,最新的是 CentOS 7.6,上面搭载的 glibc 版本是 2.17,都已经是 2012 年那时候的版本了。 现在开发者比较常用的桌面 Linux 系统,比如 Ubuntu / Debian / Mint / A...

helloclia
今天
18
3

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部