文档章节

Python学习-并发编程之协程

D7
 D7
发布于 2017/09/01 00:06
字数 586
阅读 24
收藏 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 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 高性能编程之协程

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

passionfly
2015/05/07
0
0
Go语言中协程的概念和基本使用

Go协程(Goroutine)是与其他函数同时运行的函数。可以认为Go协程是轻量级的线程。与创建线程相比,创建Go协程的成本很小。因此在Go中同时运行上千个协程是很常见的。 1、 Go语言的并发性 Go...

Oo若离oO
05/22
0
0
Python高级编程和异步IO并发编程

Python高级编程和异步IO并发编程 网盘地址:https://pan.baidu.com/s/1eB-BsUacBRhKxh7qXwndMQ 密码: tgba 备用地址(腾讯微云):https://share.weiyun.com/5Z3x9V0 密码:7cdnb2 针对Pytho...

人气王子333
04/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

实战讲解高并发和秒杀抢购系统设计

互联网特别是电商平台,阿里双11秒杀、还有12306春运抢票、以及平时各种节假日抢购活动等,都是典型的高并发场景。 这类场景最大的特征就是活动周期短,瞬间流量大(高并发),大量的人短期涌...

xtof
10分钟前
0
0
代码质量管理平台-sonarqube

在工作中,往往开发的时候会不怎么注重代码质量的人很多,存在着很多的漏洞和隐患等问题,sonarqube可以进行代码质量的审核,而且十分的残酷。。。。。接下来我们说下怎么安装 进入官网下载:...

落叶清风
13分钟前
4
0
在Ubuntu安装和配置Sphinx

Ubuntu系统默认是配置有sphinx的,先检查一下,别多此一举。。。。。 在开始本指南之前,您需要: 一个Ubuntu 16.04服务器。 sudo的一个非root用户,您可以通过以下设置本教程 。 安装在服务...

阿锋zxf
22分钟前
0
0
Qt编写输入法V2018超级终结版

对于qt嵌入式linux开发人员来说,输入法一直是个鸡肋问题,要么不支持实体键盘同步,要么不能汉字输入,要么不支持网页输入等,这几年通过陆续接触大量的各种输入法应用场景客户,得到真实需...

飞扬青云
33分钟前
0
0
TypeScript基础入门之高级类型的多态的 this类型

转发 TypeScript基础入门之高级类型的多态的 this类型 高级类型 多态的this类型 多态的this类型表示的是某个包含类或接口的子类型。 这被称做F-bounded多态性。 它能很容易的表现连贯接口间的...

durban
40分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部