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之py2exe打包工具详解
Jun 14 Python
python3实现公众号每日定时发送日报和图片
Feb 24 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
Feb 19 Python
Python基本数据结构之字典类型dict用法分析
Jun 08 Python
python hough变换检测直线的实现方法
Jul 12 Python
Django ORM 常用字段与不常用字段汇总
Aug 09 Python
关于pytorch中网络loss传播和参数更新的理解
Aug 20 Python
Django+zTree构建组织架构树的方法
Aug 21 Python
Python和Anaconda和Pycharm安装教程图文详解
Feb 04 Python
详解Python中第三方库Faker
Sep 25 Python
Pycharm如何自动生成头文件注释
Nov 14 Python
python批量提取图片信息并保存的实现
Feb 05 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
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
PHP响应post请求上传文件的方法
2015/12/17 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
php微信开发之带参数二维码的使用
2016/08/03 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
thinkPHP5框架接口写法简单示例
2019/08/05 PHP
基于jQuery的弹出消息插件 DivAlert之旅(一)
2010/04/01 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
2014/07/31 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
D3.js中data(), enter() 和 exit()的问题详解
2015/08/17 Javascript
js实现新浪微博首页效果
2015/10/16 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
angular-ui-sortable实现可拖拽排序列表
2016/12/28 Javascript
原生js开发的日历插件
2017/02/04 Javascript
JavaScript基于扩展String实现替换字符串中index处字符的方法
2017/06/13 Javascript
在NPM发布自己造的轮子的方法步骤
2019/03/09 Javascript
从0到1搭建Element的后台框架的方法步骤
2019/04/10 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
Node 模块原理与用法详解
2020/05/13 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
python使用scrapy解析js示例
2014/01/23 Python
Python控制多进程与多线程并发数总结
2016/10/26 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
Pytorch中Tensor与各种图像格式的相互转化详解
2019/12/26 Python
django项目中新增app的2种实现方法
2020/04/01 Python
文员求职信
2014/07/15 职场文书
就业协议书样本
2014/08/20 职场文书
课前一分钟演讲稿
2014/08/26 职场文书
社区三八妇女节活动总结
2015/02/06 职场文书
2016春季幼儿园小班开学寄语
2015/12/03 职场文书
Axios代理配置及封装响应拦截处理方式
2022/04/07 Vue.js