python协程的多种实现方式
2017-11-16 17:02
477 查看
协程简介:
协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。
一个程序可以包含多个协程,可以对比与一个进程包含多个线程,因而下面我们来比较协程和线程。我们知道多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。
(以上摘自百度百科)
简单的来讲就是在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再换到原来的函数都由开发者自己确定
协程的实现方式有很多,这里我们来列举三种基本方式.
第一种 利用 yield 来实现协程:
第二种 利用 greenlet 模块实现:
greenlet已经实现了协程,但是这个还得人工切换,是不是觉得很麻烦,python还有一个比greenlet更强大的并且能够自动切换任务的模块 gevent
第三种:
协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。
一个程序可以包含多个协程,可以对比与一个进程包含多个线程,因而下面我们来比较协程和线程。我们知道多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。
(以上摘自百度百科)
简单的来讲就是在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再换到原来的函数都由开发者自己确定
协程的实现方式有很多,这里我们来列举三种基本方式.
第一种 利用 yield 来实现协程:
import time def 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 time import greenlet def 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 gevent import time def 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])
相关文章推荐
- python epoll简单模型(协程的实现方式)
- Python模拟登录多种实现方式
- 生产者/消费者问题的多种Java实现方式
- 多种方式实现WPS表格单元格的合并
- 多种方式实现Android定时任务,哪一款是你的FEEL?
- paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较
- 实现斐波拉契数列的四种方式python代码
- python中package机制的两种实现方式
- 生产者/消费者模式的多种Java实现方式
- 【python中二叉树的实现】python中二叉树的创建、三种方式递归遍历和非递归遍历
- 生产者/消费者问题的多种Java实现方式
- Python图片中的缩放实现,以及多种尺寸icon的生成
- Android高仿QQ及微信底部菜单的多种实现方式【附源码地址】
- SwitchButton 开关按钮 的多种实现方式 (附源码DEMO)
- 多种jQuery绑定事件的实现方式
- Java及Python线程实现方式带实例
- python的多种实现(python之所以能称为胶水预言的关键)
- Java单例模式 多种实现方式
- python实现的json数据以HTTP GET,POST,PUT,DELETE方式页面请求
- 多种方式实现(jdk原生api实现/httpClient的实现) java 发送http(post/get)请求并携带参数(讲解超详细)