文档章节

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 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分布式计算》第2章 异步编程 (Distributed Computing with Python)

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

seancheney
2017/10/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

docker部署springboot项目

安装docker 菜鸟教程 springboot项目 maven依赖 <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001......

yimingkeji
今天
10
0
ios多个target

1.建立3个target,分别为heroone,heroone test,heroone dev;分别为正式环境,test环境,dev环境 2.注意取消掉autocreate以防止名字不对,分别以Duplicate的方式建立另外两个scheme 3.创建...

HeroHY
今天
5
0
php获取客户端IP

php获取客户端IP 首先先阅读关于IP真实性安全的文章:如何正確的取得使用者 IP? 「任何從客戶端取得的資料都是不可信任的!」 HTTP_CLIENT_IP头是有的,但未成标准,不一定服务器都实现。 ...

DrChenXX
昨天
0
0
. The valid characters are defined in RFC 7230 and RFC 问题

通过这里的回答,我们可以知道: Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。 具体来说,就是添加了些规则去限制HTTP头的规范性 参考这里 具体来说: org.apache.tom...

west_coast
昨天
1
0
刷leetcode第704题-二分查找

今天双十一买的算法书到货了,路上刷到有人说的这个题,借(chao)鉴(xi)一下别人的思路,这个是C++标准库里面的经典方法,思路精巧,优雅好品味 int search(int* nums, int numsSize, in...

锟斤拷烫烫烫
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部