文档章节

Python 学习笔记 - 协程

乐搏学院
 乐搏学院
发布于 2017/04/11 10:39
字数 599
阅读 8
收藏 0

Python里面控制并发,除了多线程和多进程,还可以使用协程(CoRoutine)。他是在一个线程内通过程序员人为的指定来进行切换

 

例1:通过switch()可以人为来回切换到另外一个函数;当所有函数执行完毕,最后输出print(10)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# Author:Alex Li

from greenlet import greenlet

def test1():

    print(12)

    gr2.switch()

    print(34)

    gr2.switch()

    print('9')

def test2():

    print(56)

    gr1.switch()

    print(78)

    gr1.switch()

gr1 = greenlet(test1)

gr2 = greenlet(test2)

gr1.switch()

print(10)

--------

12

56

34

78

9

10

 

例2,除了greenlet模块 我们还可以使用gevent模块

gevent是第三方库,通过greenlet实现协程,其基本思想是:

当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。

由于切换是在IO操作时自动完成,所以gevent需要修改Python自带的一些标准库,这一过程在启动时通过monkey patch完成:

 

例如:首先导入Gevent和猴子补丁,然后定义一个函数f,gevent.spawn的主要功能是生产greenlet的对象,然后他会内部自动切换,当执行了第一个打印命令之后,因为会阻塞,所以会自动切换到其他的greenlet对象执行操作,之后再切换回来获取数据结果。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#!/usr/bin/env python

# -*- coding:utf-8 -*-

 

from gevent import monkey; monkey.patch_all()

import gevent

import requests

def f(url):

    print('GET: %s' % url)

    resp = requests.get(url)

    data = resp.text

    print('%d bytes received from %s.' % (len(data), url))

gevent.joinall([

        gevent.spawn(f, 'https://www.python.org/'),

        gevent.spawn(f, 'https://www.yahoo.com/'),

        gevent.spawn(f, 'https://github.com/'),

])

----------

"C:\Program Files\Python3\python.exe" C:/temp/s13day11/day11/s18.py

GET: https://www.python.org/

GET: https://www.yahoo.com/

GET: https://github.com/

47413 bytes received from https://www.python.org/.

24810 bytes received from https://github.com/.

450576 bytes received from https://www.yahoo.com/.

 

登录乐搏学院官网http://www.learnbo.com/

或关注我们的官方微博微信,还有更多惊喜哦~

 

本文出自 “麻婆豆腐” 博客,请务必保留此出处http://beanxyz.blog.51cto.com/5570417/1869198

© 著作权归作者所有

乐搏学院
粉丝 9
博文 526
码字总数 707467
作品 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
并发编程学习总结

我看书有个特点,不写笔记,就感觉好像没有看过书,印象不深刻(虽然写了也未必深刻),所以我看书会比较慢,笔记会很多。这里总结一下并发。 最近学习《深入理解计算机系统》,最后一章中讲...

晨曦之光
2012/06/06
128
0
Python项目实战:抓取大型网站JS特效模板

前言 今天为大家结果一个利用Python爬虫程序来获取懒人图库的JS特效模板,利用到了gevent,有了gevent,协程的使用将无比简单,你根本无须像greenlet一样显式的切换,每当一个协程阻塞时,程序...

python小白1
前天
0
0
python学习笔记 | Python中并行IO操作的内存效率

Python允许多种不同的并行处理方法。并行性的主要问题是了解其局限性。我们要么平行IO操作或像图像处理这样的CPU限制任务。 在Python 3.5之前,有两种方法可以并行处理IO绑定操作。本地方法是...

跨界的聚能
2018/05/24
0
0
Python 协程:协程才是未来 / 被线程替代 / 推与拉

协程三篇之一(协程初接触) 协程虽然如此之好,看是很长时间以来,因为受到基于堆栈的子例程实现的限制,并没有多少语言在其实语言或库中支持协程,所以线程作为一个替代者(当然,线程也有...

岭南六少
2011/08/10
0
1

没有更多内容

加载失败,请刷新页面

加载更多

在阿里云ecs服务器(linux之centos系统)安装调试nginx

购买阿里云ecs服务器实例 由于这里只是测试,我们就随便买一个(当然我就选最便宜的了,这里的抢占式实例测试完可以直接释放) 选择centos7.6镜像 点击下一步:网络和安全组 接下来选中开通h...

祖达
昨天
2
0
【阴阳师】真蛇10层记录

蛇切黑体系 追月神 散件一速,速度越高越好(220+) 镰鼬 招财二速,速度211以上; 山兔 火灵三速,速度180-200均可; 丑女 心眼四速,速度170左右即可; 大蛇 蚌精暴击套。速度高于阴阳师即...

Areya
昨天
5
0
js动态设置元素高度

this.$refs.xxx.style.height= this.contentHeight; 元素需要绑定

Carbenson
昨天
3
0
今天的学习

今天学到了ci框架中的查询语句的where条件语句: 1、$this->db->select('')->from('')->where('id = ??')->get()->result_array();2、$this->db->select('')->from('')->where('id', '??'......

墨冥
昨天
2
0
MySQL在高并发下的订单撮合、系统使用、共享锁与排他锁保证数据一致性

前序 距离上次择文发表,两月余久。2018年也即将要结束了,目前的工作依然是与区块链应用相关的,也很荣幸在9月初受邀签约出版暂名为《区块链以太坊DApp实战开发》一书,预计在明年年初出版。...

我最喜欢三大框架
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部