还是讲解下这个官网上的代码吧

代码在这:(讲解在下面)

import gevent
from gevent.event import Event
import time
'''
Illustrates the use of events
'''evt = Event()def setter():'''After 3 seconds, wake all threads waiting on the value of evt'''print('A: Hey wait for me, I have to do something')gevent.sleep(3)print("Ok, I'm done")evt.set()def waiter():'''After 3 seconds the get call will unblock'''print("I'll wait for you")evt.wait()  # blockingprint("It's about time")def main():gevent.joinall([gevent.spawn(setter),gevent.spawn(waiter),gevent.spawn(waiter),gevent.spawn(waiter),gevent.spawn(waiter),gevent.spawn(waiter)])if __name__ == '__main__':starttime = time.time()main()endtime = time.time()print('Total use time is %.3f' % (endtime - starttime))

输出的结果是:

A: Hey wait for me, I have to do something
I’ll wait for you
I’ll wait for you
I’ll wait for you
I’ll wait for you
I’ll wait for you
Ok, I’m done
It’s about time
It’s about time
It’s about time
It’s about time
It’s about time
Total use time is 3.005

从输出的来看,虽然一开始是乱序的(可能是我解释器的原因在这显示的按照那个顺序进行。)

  • 总之,setter在后来gevent.sleep(3)的时候就实现了将控制权交给其他的协程。而其他所有的协程都是等待协程(等待进行evt.wait()
  • 所以,在evt没有进行到set()函数之前都是要一直这么等待下去的。

下面我做下改变。
改写那个setter函数

def setter():'''After 3 seconds, wake all threads waiting on the value of evt'''print('A: Hey wait for me, I have to do something')gevent.sleep(3)print("Ok, I'm done")evt.set()print("After set.")gevent.sleep()print("After sleep")

A: Hey wait for me, I have to do something
I’ll wait for you
I’ll wait for you
I’ll wait for you
I’ll wait for you
I’ll wait for you
Ok, I’m done
After set.
It’s about time
It’s about time
It’s about time
It’s about time
It’s about time
After sleep
Total use time is 3.006

输出变成了下面的这样子。

  • 通过After set 在It is about time前面,我们可以推断出来。event.set()没有交换权限,只是设置了某一个类似启动按钮一样的东西一样~ 真正交换权限任然只有sleep()

多协程实例讲解(python 三)相关推荐

  1. 多协程实例讲解(四 Python)

    还是基于官方文档进行改写的结果 import gevent from gevent.event import AsyncResult a = AsyncResult()def setter():&qu ...

  2. python求三个整数最大值_实例讲解Python中整数的最大值输出

    实例讲解Python中整数的最大值输出 在Python中可以存储很大的值,如下面的Python示例程序: x = 1000000000000000000000000000000000000000000 ...

  3. 编程python爬取网页数据教程_实例讲解Python爬取网页数据

    一.利用webbrowser.open()打开一个网站: >>> import webbrowser >>> webbrowser.open('http://i.f ...

  4. 线程,协程对比和Python爬虫实战说明

    此文首发于我的个人博客:线程,协程对比和Python爬虫实战说明 - zhang0peter的个人博客 这篇文章写的是我对线程和协程的理解,有错误之处欢迎指出. 举一个餐馆的例子.我们把一个餐厅当做一 ...

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

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

  6. python中能够处理的最大整数是_实例讲解Python中整数的最大值输出

    在Python中可以存储很大的值,如下面的Python示例程序: x = 10000000000000000000000000000000000000000000; x = x + 1 print ( ...

  7. python 系统管理_实例讲解python用户管理系统

    本文主要为大家分享一篇python用户管理系统的实例讲解,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧,希望能帮助到大家. 自定义函数+装饰器,每一个模块写的一个函数 很多地方能用装 ...

  8. python爬虫教程:实例讲解Python爬取网页数据

    这篇文章给大家通过实例讲解了Python爬取网页数据的步骤以及操作过程,有兴趣的朋友跟着学习下吧. 一.利用webbrowser.open()打开一个网站: >>> import w ...

  9. 线程和协程详解-python

    1.前言 关于基本概念部分这里不再详述,可以参考之前的文章或者自行查阅相关文章. 由于python中线程的创建.属性和方法和进程很相似,这里也不再讲解. 这里重点讲解下多线程访问共享数据的相关问题. ...

最新文章

  1. 服务器空闲搭建什么网站,空闲的云服务器可以干什么
  2. Silverlight中如何实现上下标的显示
  3. Virtural Box 虚拟ubuntu 修改分辨率
  4. django 静态数据_如何在Django中使用静态数据?
  5. 内存墙,多核CPU的终结者?
  6. python stringstrip方法详解_Python 基础知识全篇-字符串(Strings)
  7. 重磅!GitLab 在中国成立公司极狐,GitHub 还会远吗?
  8. 动态网页和静态网页的区别是什么?
  9. 知网哭穷赔不起1200亿,网友:收钱时咋不嫌多
  10. 自动驾驶软件开发人才现状_一文读懂自动驾驶研究现状
  11. 2048的C语言实现
  12. 制作表情包(python)
  13. python爬虫获取网站销售情况(内置源码)
  14. 互联网众筹系统开发-一站式搭建众筹项目建设
  15. JAVA发送手机短信,httpclient短信发送接口示例(java)
  16. 手机换IP的方法--手机PPTP
  17. js实现用户输入年月份,判断是否为闰年,该月份有多少天
  18. 困扰的Byte、bit 、和16进制之间的关系
  19. Spellchecker inspection helps locate typos and misspelling in your
  20. 7-11 Say Hello to Integers

热门文章

  1. S3C6410的SPI控制器
  2. bd5.2 Django
  3. HandlerThread原理与应用
  4. 《深入理解C++11:C++ 11新特性解析与应用》——3.2 委派构造函数
  5. 5种处理js跨域问题方法汇总(转载)
  6. IT草根的江湖之路之六:曙光,第一次破例
  7. 再次推荐数据安全清除软件----Eraser
  8. c++ 暂停功能_10月10日丨注意:东部华侨城茶溪谷暂停开放!深圳9月街道环卫榜出炉!前五街道盐田占其三!…今日盐田大小事...
  9. Build Search for Common Use Cases
  10. 普通函数与函数模板的区别