Python 学习笔记 - 协程
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 / .
|
Python 学习笔记 - 协程相关推荐
- python学习之-- 协程
协程(coroutine) 也叫:微线程,是一种用户态的轻量级线程,就是在单线程下实现并发的效果. 优点: 1:无需线程上下文切换的开销.(就是函数之间来回切换) 2:无需原子操作锁定及同步的开销.( ...
- 学到中年的python学习笔记12--进程和线程
目录 1. 简介 2. Python多进程编程 3. 进程间通信 3.1 Python multiprocessing模块下的Queue类 3.2 Pipe,又称为"管道" 4. ...
- python学习笔记目录
人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...
- Python学习笔记(六)
1. IO编程 1.1 文件读写 1.2 StringIO和BytesIO 1.3 操作文件和目录 1.4 序列化 2. 进程和线程 2.1 多进程 2.2 多线程 2.3 ThreadLocal 2 ...
- Python学习笔记:Day 3编写ORM
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:异步IO(2)
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:异步IO(1)
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:web开发2
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:常用第三方模块3
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
最新文章
- java和python哪个好学-学java好还是Python好?
- linux三 gdb/makefeile/io
- 利用python进行数据分析学习笔记(2)
- 深入浅出gRPC——极客时间李林锋
- 一种简单定义FourCC常量的方法 (C/C++)
- Eclipse字符集设置方式
- 云数据库精华问答 | 云数据库与其他数据库的关系
- VLAN基本通信原理
- java 判断object类型_Java多态的6大特性|乐字节
- Eclipse插件Ant里运用ftp遇到的问题
- [Android Pro] java.lang.IllegalStateException: Fragment(XXFragment) not attached to Activity异常
- 虚拟化技术-KVM详解
- 申请数据库资源池的三种方式(Map,properties)
- java 华氏温度转换为摄氏温度
- kappa一致性检验教程_一致性检验的几种方式--ICC、kappa、weighted kappa、Kendall
- IMGUI_DX11显示自定义图片
- keras.datasets.imdb.py 源码分析
- MTK-MT65-MT67系列对比
- 令狐冲和TCP/IP协议的第三层协议的关系(经典)
- 如何计算算法的时间复杂度