Python greenlet和gevent使用代码示例解析


Posted in Python onApril 01, 2020

greenlet示例

greenlet微线程,允许在线程中手动切换

示例1,线程切换

from greenlet import greenlet

def test1(x,y):
  z = gr2.switch(x+y)
  print(z)

def test2(u):
  print(u)
  gr1.switch(42)

gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch("hello",'world')

gr1和gr2是两个greenlet线程,使用gr1.switch(..)启动gr1,gr1执行test1,切换到gr2,gr2执行test2打印helloworld,然后切换回gr1,z获取

到返回值42,并打印.

执行顺序为:

gr1.switch("hello",'world') -> test1('hello','world')->

gr2.switch('helloword')->test2('helloworld')->print('helloworld')

->gr1.switch(42)->z=42->print(42)

打印结果:

helloworld
42

示例2

from greenlet import greenlet

def eat(name):
  print('%s eat 1' %name)
  g2.switch('egon')
  print('%s eat 2' %name)
  g2.switch()
def play(name):
  print('%s play 1' %name)
  g1.switch()
  print('%s play 2' %name)

g1=greenlet(eat)
g2=greenlet(play)

g1.switch('egon')#可以在第一次switch时传入参数,以后都不需要

g1.switch('egon')#可以在第一次switch时传入参数,以后都不需要

gevent

gevent基于greenlet,遇到IO操作自动切换,IO操作比如网络请求,或使用 gevent.sleep(0)强制切换.

示例1

import gevent

def func1():
  print("start func1")
  gevent.sleep(1)
  print("end func1")

def func2():
   print("start func2")
  gevent.sleep(1)
  print("end func2")

gevent.joinall(
  [
    gevent.spawn(func1),
    gevent.spawn(func2)
  ]
)

执行结果:

start func1
start func2
end func1
end func2
``

示例2: gevent使用monkey对所有系统自带的IO操作打patch

```python
from gevent import monkey;monkey.patch_all()

import gevent
import time
def eat():
  print('eat food 1')
  time.sleep(2) # 会自动的跳转到play
  print('eat food 2')

def play():
  print('play 1')
  time.sleep(1) # 会自动的跳转到eat
  print('play 2')

g1=gevent.spawn(eat)
g2=gevent.spawn(play)
gevent.joinall([g1,g2])
print('end')

执行结果

eat food 1
play 1
play 2
eat food 2
end

示例3,发送请求

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/'),
    gevent.spawn(f, 'https://github.com/'),
    gevent.spawn(f, 'https://github.com/'),
    gevent.spawn(f, 'https://github.com/'),
    gevent.spawn(f, 'https://github.com/'),
])

示例4:使用gevent的socket替代系统的socket

import gevent
from gevent import socket

urls = ['www.baidu.com', 'www.163.com', 'www.qq.com']
jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls]
gevent.joinall(jobs, timeout=2)

print([job.value for job in jobs])
或使用patch_socket()
from gevent import monkey; monkey.patch_socket()
import gevent

def f(n):
  for i in range(n):
    print(gevent.getcurrent(), i)
    gevent.sleep(0) # 不加的话不会交替执行
g1 = gevent.spawn(f, 5)
g2 = gevent.spawn(f, 5)
g3 = gevent.spawn(f, 5)
g1.join()
g2.join()
g3.join()

示例5:队列中使用gevent.sleet(0)强制切换到其他线程

import gevent
from gevent.queue import Queue


def func():
  for i in range(10):
    print("int the func")
    q.put(f"test{i}")
    gevent.sleep(0)

def func2():
  for i in range(10):
    print("int the func2")
    res = q.get()
    print("--->",res)

q = Queue()
gevent.joinall(
  [
    gevent.spawn(func2),
    gevent.spawn(func),
  ]
)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基于socket实现网络广播的方法
Apr 29 Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
Mar 22 Python
Python操作Sql Server 2008数据库的方法详解
May 17 Python
python使用xlrd和xlwt读写Excel文件的实例代码
Sep 05 Python
Python学习笔记之图片人脸检测识别实例教程
Mar 06 Python
python实现大战外星人小游戏实例代码
Dec 26 Python
Python Sphinx使用实例及问题解决
Jan 17 Python
Python 保存加载mat格式文件的示例代码
Aug 04 Python
Python多分支if语句的使用
Sep 03 Python
python某漫画app逆向
Mar 31 Python
python编写五子棋游戏
May 25 Python
Django-rest-framework中过滤器的定制实例
Apr 01 #Python
Python如何操作office实现自动化及win32com.client的运用
Apr 01 #Python
Django之choices选项和富文本编辑器的使用详解
Apr 01 #Python
Python AutoCAD 系统设置的实现方法
Apr 01 #Python
django实现模型字段动态choice的操作
Apr 01 #Python
Python气泡提示与标签的实现
Apr 01 #Python
django 多数据库及分库实现方式
Apr 01 #Python
You might like
php.ini中date.timezone设置分析
2011/07/29 PHP
PHP foreach遍历多维数组实现方式
2016/11/16 PHP
如何简单地用YUI做JavaScript动画
2007/03/10 Javascript
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
js去字符串前后空格5种实现方法及比较
2013/04/03 Javascript
正负小数点后两位浮点数实现原理及代码
2013/09/06 Javascript
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
ionic 上拉菜单(ActionSheet)实例代码
2016/06/06 Javascript
Node.js 文件夹目录结构创建实例代码
2016/07/08 Javascript
原生js实现放大镜
2017/02/20 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
2017/04/27 Javascript
xmlplus组件设计系列之树(Tree)(9)
2017/05/02 Javascript
关于vue-cli 3配置打包优化要点(推荐)
2019/04/22 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
[01:13:01]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第三场
2018/04/05 DOTA
Python插件virtualenv搭建虚拟环境
2017/11/20 Python
Python使用matplotlib的pie函数绘制饼状图功能示例
2018/01/08 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
python模拟鼠标点击和键盘输入的操作
2019/08/04 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
Python并发爬虫常用实现方法解析
2020/11/19 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
HTML5中的autofocus(自动聚焦)属性介绍
2014/04/23 HTML / CSS
Html5 FileReader实现即时上传图片功能实例代码
2014/09/01 HTML / CSS
英国领先的鞋类零售商和顶级品牌的官方零售商:Wynsors
2020/02/17 全球购物
Napapijri西班牙在线商店:夹克、外套、运动衫等
2020/11/05 全球购物
.NET概念性的面试题
2012/02/29 面试题
学生实习自我鉴定
2013/10/11 职场文书
我的求职择业计划书
2014/04/04 职场文书
考博专家推荐信
2014/05/10 职场文书
信息合作协议书
2014/10/09 职场文书
创业计划书之电动车企业
2019/10/11 职场文书