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线程中对join方法的运用的教程
Apr 09 Python
python Web开发你要理解的WSGI & uwsgi详解
Aug 01 Python
pandas重新生成索引的方法
Nov 06 Python
Python unittest 简单实现参数化的方法
Nov 30 Python
Python实现的矩阵转置与矩阵相乘运算示例
Mar 26 Python
在windows下使用python进行串口通讯的方法
Jul 02 Python
Python 获取项目根路径的代码
Sep 27 Python
Python使用docx模块实现刷题功能代码
Feb 13 Python
Python解释器以及PyCharm的安装教程图文详解
Feb 26 Python
Python如何实现定时器功能
May 28 Python
Django+RestFramework API接口及接口文档并返回json数据操作
Jul 12 Python
PyCharm常用配置和常用插件(小结)
Feb 06 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中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
2012/11/01 PHP
php curl的深入解析
2013/06/02 PHP
深入apache配置文件httpd.conf的部分参数说明
2013/06/28 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
JQUERY操作JSON实例代码
2010/02/09 Javascript
js 火狐下取本地路径实现思路
2013/04/02 Javascript
js中符号转意问题示例探讨
2013/08/19 Javascript
javascript实现简单的省市区三级联动
2015/05/14 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
跟我学习javascript创建对象(类)的8种方法
2015/11/20 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
jQuery日程管理插件fullcalendar使用详解
2017/01/07 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
微信小程序实现顶部普通选项卡效果(非swiper)
2020/06/19 Javascript
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
深入理解webpack process.env.NODE_ENV配置
2020/02/23 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
Python栈类实例分析
2015/06/15 Python
python使用Apriori算法进行关联性解析
2017/12/21 Python
TensorFlow深度学习之卷积神经网络CNN
2018/03/09 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
PyTorch的SoftMax交叉熵损失和梯度用法
2020/01/15 Python
css3实例教程 一款纯css3实现的环形导航菜单
2014/10/20 HTML / CSS
Net-A-Porter美国官网:全球时尚奢侈品名站
2017/02/11 全球购物
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
印度领先的眼镜电子商务网站:Lenskart
2019/12/16 全球购物
拓展策划方案
2014/06/03 职场文书
松材线虫病防治方案
2014/06/15 职场文书
财务负责人岗位职责
2015/02/03 职场文书
初中军训感想
2015/08/07 职场文书
python 实现图与图之间的间距调整subplots_adjust
2021/05/21 Python
如何用vue实现网页截图你知道吗
2021/11/17 Vue.js