0.生成器

1.使用yield完成多任务

import timedef task_1():while True:print("---1----")time.sleep(0.1)yielddef task_2():while True:print("---2----")time.sleep(0.1)yielddef main():t1 = task_1()t2 = task_2()# 先让t1运行一会,当t1中遇到yield的时候,再返回到24行,然后# 执行t2,当它遇到yield的时候,再次切换到t1中# 这样t1/t2/t1/t2的交替运行,最终实现了多任务....协程while True:next(t1)next(t2)if __name__ == "__main__":main()

运行结果:

---1----
---2----
---1----
---2----
---1----
---2----
---1----
...

2.使用greenlet完成多任务

from greenlet import greenlet
import timedef test1():while True:print("---A--")gr2.switch()time.sleep(0.5)def test2():while True:print("---B--")gr1.switch()time.sleep(0.5)#创建生成器对象
gr1 = greenlet(test1)
gr2 = greenlet(test2)#切换到gr1中运行,开始输出
gr1.switch()

运行结果:

---A--
---B--
---A--
---B--
---A--
....

3.使用gevent完成多任务

import gevent
import timedef f1(n):for i in range(n):print(gevent.getcurrent(), i)# time.sleep(0.5)gevent.sleep(0.5) #延时、堵塞等操作,都需要换成gevent里边的相应方法def f2(n):for i in range(n):print(gevent.getcurrent(), i)# time.sleep(0.5)gevent.sleep(0.5) #延时、堵塞等操作,都需要换成gevent里边的相应方法def f3(n):for i in range(n):print(gevent.getcurrent(), i)# time.sleep(0.5)gevent.sleep(0.5)  #延时、堵塞等操作,都需要换成gevent里边的相应方法print("----1---")
g1 = gevent.spawn(f1, 5)
print("----2---")
g2 = gevent.spawn(f2, 5)
print("----3---")
g3 = gevent.spawn(f3, 5)
print("----4---")
g1.join()   # 堵塞,等待完成
g2.join()   # 堵塞,等待完成
g3.join()   # 堵塞,等待完成

运行结果:

----1---
----2---
----3---
----4---
<Greenlet at 0x15bf8f917b8: f1(5)> 0
<Greenlet at 0x15bf8f918c8: f2(5)> 0
<Greenlet at 0x15bf8f919d8: f3(5)> 0
<Greenlet at 0x15bf8f917b8: f1(5)> 1
<Greenlet at 0x15bf8f918c8: f2(5)> 1
<Greenlet at 0x15bf8f919d8: f3(5)> 1
<Greenlet at 0x15bf8f917b8: f1(5)> 2
<Greenlet at 0x15bf8f918c8: f2(5)> 2
<Greenlet at 0x15bf8f919d8: f3(5)> 2
<Greenlet at 0x15bf8f917b8: f1(5)> 3
<Greenlet at 0x15bf8f918c8: f2(5)> 3
<Greenlet at 0x15bf8f919d8: f3(5)> 3
<Greenlet at 0x15bf8f917b8: f1(5)> 4
<Greenlet at 0x15bf8f918c8: f2(5)> 4
<Greenlet at 0x15bf8f919d8: f3(5)> 4

注意,此时使用的延时是gevent.sleep(0.5),若使用time.sleep(0.5),则输出结果如下:

----1---
----2---
----3---
----4---
<Greenlet at 0x2b3ce8917b8: f1(5)> 0
<Greenlet at 0x2b3ce8917b8: f1(5)> 1
<Greenlet at 0x2b3ce8917b8: f1(5)> 2
<Greenlet at 0x2b3ce8917b8: f1(5)> 3
<Greenlet at 0x2b3ce8917b8: f1(5)> 4
<Greenlet at 0x2b3ce8918c8: f2(5)> 0
<Greenlet at 0x2b3ce8918c8: f2(5)> 1
<Greenlet at 0x2b3ce8918c8: f2(5)> 2
<Greenlet at 0x2b3ce8918c8: f2(5)> 3
<Greenlet at 0x2b3ce8918c8: f2(5)> 4
<Greenlet at 0x2b3ce8919d8: f3(5)> 0
<Greenlet at 0x2b3ce8919d8: f3(5)> 1
<Greenlet at 0x2b3ce8919d8: f3(5)> 2
<Greenlet at 0x2b3ce8919d8: f3(5)> 3
<Greenlet at 0x2b3ce8919d8: f3(5)> 4

4.gevent打补丁

有耗时操作时,需要将程序中用到的耗时操作的代码,替换成gevent中自己实现的模块,比如讲time.sleep(0.5)自动替换gevent.sleep(0.5),需要打补丁,方法如下:

首先导入:from gevent import monkey
然后执行:monkey.patch_all()

import gevent
import time
from gevent import monkey# 有耗时操作时,需要将程序中用到的耗时操作的代码,替换成gevent中自己实现的模块
monkey.patch_all()def f1(n):for i in range(n):print(gevent.getcurrent(), i)time.sleep(0.5)def f2(n):for i in range(n):print(gevent.getcurrent(), i)time.sleep(0.5)def f3(n):for i in range(n):print(gevent.getcurrent(), i)time.sleep(0.5)print("----1---")
g1 = gevent.spawn(f1, 5)
print("----2---")
g2 = gevent.spawn(f2, 5)
print("----3---")
g3 = gevent.spawn(f3, 5)
print("----4---")
g1.join()
g2.join()
g3.join()

Python协程--生成器(实现多任务)相关推荐

  1. Python协程--生成器(通过异常来判断生成器已经结束)

    以实现斐波那契数列为例: def create_num(all_num):a, b = 0, 1current_num = 0while current_num < all_num:yield ...

  2. python 协程_Python 协程与 Go 协程的区别(一)

    ? "Python猫" ,一个值得加星标的公众号 花下猫语:年关将近,不知各位过得怎样?我最近有些忙,收获也挺多,以后有机会分享下.吃饭时间,追了两部剧<了不起的麦瑟尔夫人& ...

  3. python中协程与函数的区别_深入浅析python 协程与go协程的区别

    进程.线程和协程 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进 ...

  4. c++ 协程_理解Python协程(Coroutine)

    由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...

  5. python协程学习

    学习知识点: 1.知识点叫什么 2.知识点用在哪 3.知识如何实现 一. 线程.进程.协程傻傻分不清楚 1.进程 :启动多个进程 进程之间是由操作系统负责调用   线程 :启动多个线程 真正被cpu执 ...

  6. python协程(超详细)

    1.迭代 1.1 迭代的概念 使用for循环遍历取值的过程叫做迭代,比如:使用for循环遍历列表获取值的过程 # Python 中的迭代 for value in [2, 3, 4]:print(va ...

  7. python 协程 (概念+示例代码)

    目录 1. 迭代器 1.1 迭代器应用:自定义列表 1.2 迭代器应用:斐波那契数列 2. 生成器 2.1 生成器案例:斐波那契数列 2.2 生成器注意事项 3. 协程 3.1 yield 简单实现协 ...

  8. python协程实时输出_python协程

    不知道你有没有被问到过有没有使用过的python协程? 协程是什么? 协程是一种用户态轻量级,是实现并发编程的一种方式.说到并发,就能想到了多线程 / 多进程模型,是解决并发问题的经典模型之一. 但是 ...

  9. 从yield 到yield from再到python协程

    yield 关键字 def fib():a, b = 0, 1while 1:yield ba, b = b, a+b yield 是在:PEP 255 -- Simple Generators 这个 ...

最新文章

  1. COM中的IDL语言的难点之接口指针
  2. Glide-源码分析(一)
  3. python中的字符串是什么,一文秒懂Python中的字符串
  4. 吃完晚饭干什么的好方法
  5. drf5 版本和认证组件
  6. leftjoin多表联合查询_leetcode-sql练习精讲系列文章——一、多表如何连接
  7. excel文件成绩处理python代码_Python处理Excel文件实例代码
  8. nginx事件 -- 第六篇 stale event
  9. TypeError: Object of type ‘TrackedArray‘ is not JSON serializable
  10. java 文件解签加签_将更改的文件移到另一个分支进行签入
  11. 使用Eclipse构建Maven项目 (step-by-step) (转收藏)
  12. 51单片机外设篇:电机
  13. 服务器2008r2如何系统还原,windows如何创建系统还原点和还原点还原系统的使用方法...
  14. CGM植物微生物组专题研讨(王亚玉/王孝林/刘永鑫/周骏,晚7点)
  15. 研究生图像处理该怎的自学_我的研究生这三年
  16. 虚拟机匹配合适的服务器,如何为虚拟机选择合适的服务器硬件?
  17. FME高性能编程,让你的FME快起来
  18. 在解决prob中遇到的prob...
  19. python 创建空的numpy数组_真假美猴王-Numpy数据与Python数组的区别与联系
  20. android 图片合成

热门文章

  1. Java基础——Java异常处理机制
  2. C/C++开发者必不可少的15款编译器+IDE
  3. 如何成为一个技术“牛人”
  4. JM8.5中的7种宏块模式问题
  5. FFMpeg的output_example.c例子分析
  6. 如何在 IDEA 启动多个 Spring Boot 工程实例
  7. Linux ping命令、Linux kill命令、Linux logname命令、 Linux logout命令
  8. 关于[super dealloc]
  9. 刷新SWAP分区方法
  10. php 安装xdebug扩展