python协程的多种实现方式
来源:互联网 发布:圆周率网络 编辑:程序博客网 时间:2024/06/01 23:19
协程简介:
协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。
一个程序可以包含多个协程,可以对比与一个进程包含多个线程,因而下面我们来比较协程和线程。我们知道多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。
(以上摘自百度百科)
简单的来讲就是在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再换到原来的函数都由开发者自己确定
协程的实现方式有很多,这里我们来列举三种基本方式.
第一种 利用 yield 来实现协程:
import timedef work1(): # 循环打印数字1 while True: print("-----1-----") # yield可以暂时挂起该函数,跳转到调用该函数的下方 yield # 延迟一秒以便观察 time.sleep(1)def work2(): while True: print("-----2-----") yield time.sleep(1)th1 = work1()th2 = work2()while True: # 唤醒被挂起的函数 next(th1) next(th2)
第二种 利用 greenlet 模块实现:
import timeimport greenletdef work1(): # 循环打印字符串 while True: print("----1----") # 启动th2 th2.switch() time.sleep(1)def work2(): # 循环打印字符串 while True: print("----2----") # 启动th1 th1.switch() time.sleep(1)# 创建携程th1 = greenlet.greenlet(work1)th2 = greenlet.greenlet(work2)# 启动携程th1.switch()
greenlet已经实现了协程,但是这个还得人工切换,是不是觉得很麻烦,python还有一个比greenlet更强大的并且能够自动切换任务的模块 gevent
第三种:
import geventimport timedef work1(): # 循环打印 while True: print("----1----") # 破解sleep 使sleep不再阻塞 gevent.sleep(1)def work2(): while True: print("----2----") gevent.sleep(1)# 创建并开始执行携程th1 = gevent.spawn(work1)th2 = gevent.spawn(work2)# 阻塞等待携程结束gevent.joinall([th1,th2])
阅读全文
0 0
- python协程的多种实现方式
- LRU的多种实现方式
- Python遍历目录的多种方式
- Python模块导入的多种方式
- Python 读取文件的多种方式
- javascript实现继承的多种方式
- 单例模式的多种实现方式
- 生产者消费者的多种java实现方式
- swap VS gcd的多种实现方式
- Java中单例模式的多种实现方式
- SwitchButton开关按钮的多种实现方式
- js实现继承的多种方式
- Kalman滤波的多种实现方式浅析
- 单例模式的多种实现方式
- Android 定时任务的多种实现方式
- android.onclicklistener的多种实现方式
- strlen函数的多种实现方式
- Hibernate distinct 查询的多种实现方式
- Java开发规范
- 基于easyui 框架,通过读取json 文件实现省市区三联动的效果
- DEVOPS的基本体系与流程
- hibernate主键生成策略注意native和increment
- 浅析java内存模型--JMM(Java Memory Model)
- python协程的多种实现方式
- 最短路径(Python)networkx 包
- 2708 1-2 输出N个数的平方和立方值
- jdbc连接mysql数据库 java
- windows安装MongoDB
- Vue.js解析(二)【依赖收集】
- Linux硬连接和软连接详解
- bytes=new Byte[1024]: 缓冲器的作用原理
- C#类和对象(六)——可空类型