文档章节

Python学习-并发编程之协程

D7
 D7
发布于 2017/09/01 00:06
字数 586
阅读 71
收藏 0

精选30+云产品,助力企业轻松上云!>>>

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 并发编程

以下链接均来自网络 『Python并发编程』 理解Python并发编程一篇就够了 - 线程篇 理解Python并发编程一篇就够了 - 进程篇 使用Python进行并发编程-PoolExecutor篇 使用Python进行并发编程-我...

osc_4rna5n4p
2018/05/23
5
0
python asyncio

asyncio 是python3增加的特性。不过backport到了2.7了。 python 2.7 Develop with asyncio Tasks and coroutines python 3.7 asyncio(org CN) REF: 一份详细的asyncio入门教程 有大量的例子 ......

osc_etp9xzp8
2019/08/22
6
0
python教程:使用 async 和 await 协程进行并发编程

python 一直在进行并发编程的优化, 比较熟知的是使用 thread 模块多线程和 multiprocessing 多进程,后来慢慢引入基于 yield 关键字的协程。 而近几个版本,python 对于协程的写法进行了大幅...

osc_h008x2zb
04/21
70
0
python教程:使用 async 和 await 协程进行并发编程

python 一直在进行并发编程的优化, 比较熟知的是使用 thread 模块多线程和 multiprocessing 多进程,后来慢慢引入基于 yield 关键字的协程。 而近几个版本,python 对于协程的写法进行了大幅...

和牛
04/20
0
0
python并发编程之asyncio协程(三)

协程实现了在单线程下的并发,每个协程共享线程的几乎所有的资源,除了协程自己私有的上下文栈;协程的切换属于程序级别的切换,对于操作系统来说是无感知的,因此切换速度更快、开销更小、效...

osc_azsn5lm2
2018/09/05
39
0

没有更多内容

加载失败,请刷新页面

加载更多

Cocoa Autolayout:内容拥抱与内容压缩阻力优先

问题: I can't find a clear answer on Apple documentation regarding Cocoa Autolayout about the difference between content hugging and compression resistance. 关于Cocoa Autolayou......

javail
27分钟前
12
0
OSChina 周二乱弹 —— 附近居民接连失踪,你们有什么头绪吗

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《伤离别(原版)》- 黄霑 手机党少年们想听歌,请使劲儿戳(这里) @巴拉迪维 :睡...

小小编辑
37分钟前
17
0
IntelliJ IDEA 默认快捷键大全

Remember these Shortcuts 常用 功能 快捷键 备注 ● Smart code completion Ctrl + Shift + Space - ● Search everywhere Double Shift - ● Show intention actions and quick-fixes Alt......

巨輪
今天
24
0
Hacker News 简讯 2020-07-14

更新时间: 2020-07-14 02:01 Chipmaker Analog Devices to Acquire Maxim Integrated for $21B - (reuters.com) 芯片制造商模拟设备公司将以210亿美元收购Maxim Integrated 得分:92 | 评论:......

FalconChen
今天
129
0
绕过移动端系统限制的 dlopen 库 byOpen

byOpen是一个绕过移动端系统限制的增强版dlfunctions库。 支持特性 Android 支持App中加载和使用Android系统库接口(即使maps中还没有被加载也支持)。 Android 7以上dlopen, System.load都是...

shzwork
昨天
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部