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安装Scrapy图文教程
Aug 14 Python
Python实现读取及写入csv文件的方法示例
Jan 12 Python
python网络爬虫学习笔记(1)
Apr 09 Python
使用python装饰器计算函数运行时间的实例
Apr 21 Python
python使用PIL给图片添加文字生成海报示例
Aug 17 Python
Python字符串中添加、插入特定字符的方法
Sep 10 Python
Numpy中对向量、矩阵的使用详解
Oct 29 Python
使用Python的networkx绘制精美网络图教程
Nov 21 Python
Python实现自动访问网页的例子
Feb 21 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
Mar 04 Python
Python基于字典实现switch case函数调用
Jul 22 Python
python实现按日期归档文件
Jan 30 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
咖啡豆分级制度 咖啡豆等级分类 咖啡豆是按口感分类的吗?
2021/03/05 新手入门
php xfocus防注入资料
2008/04/27 PHP
php daodb插入、更新与删除数据
2009/03/19 PHP
PHP封装的MSSql操作类完整实例
2016/05/26 PHP
smarty循环嵌套用法示例分析
2016/07/19 PHP
window.location和document.location的区别分析
2008/12/23 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
cookie中的path与domain属性详解
2013/12/18 Javascript
多个checkbox被选中时如何判断是否有自己想要的
2014/09/22 Javascript
Javascript模拟加速运动与减速运动代码分享
2014/12/11 Javascript
百度地图api如何使用
2015/08/03 Javascript
JavaScript学习笔记之数组的增、删、改、查
2016/03/23 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
2016/07/06 Javascript
jQuery和JavaScript节点插入元素的方法对比
2016/11/18 Javascript
jQuery表单元素选择器代码实例
2017/02/06 Javascript
基于JavaScript实现本地图片预览
2017/02/08 Javascript
nodejs中解决异步嵌套循环和循环嵌套异步的问题
2017/07/12 NodeJs
vue页面跳转后返回原页面初始位置方法
2018/02/11 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
2018/05/03 jQuery
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
2019/04/29 Javascript
微信小程序中weui用法解析
2019/10/21 Javascript
详解Webpack抽离第三方类库以及common解决方案
2020/03/30 Javascript
从Python的源码来解析Python下的freeblock
2015/05/11 Python
python中rc1什么意思
2020/06/19 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
十月份红领巾广播稿
2014/01/22 职场文书
十佳护士获奖感言
2014/02/18 职场文书
婚礼司仪主持词
2014/03/14 职场文书
副总经理岗位职责
2015/02/02 职场文书
外贸业务员岗位职责
2015/02/13 职场文书
房产销售员2015年终工作总结
2015/10/22 职场文书
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫