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入门篇之编程习惯与特点
Oct 17 Python
python利用Guetzli批量压缩图片
Mar 23 Python
Python实现注册登录系统
Aug 08 Python
Python语言描述KNN算法与Kd树
Dec 13 Python
vue.js实现输入框输入值内容实时响应变化示例
Jul 07 Python
python使用Matplotlib画条形图
Mar 25 Python
Python 实现数据结构-堆栈和队列的操作方法
Jul 17 Python
python如何将两个txt文件内容合并
Oct 18 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
Oct 25 Python
python之MSE、MAE、RMSE的使用
Feb 24 Python
超全Python图像处理讲解(多模块实现)
Apr 13 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
May 19 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使用websocket示例详解
2014/03/12 PHP
PHP中cookie和session的区别实例分析
2014/08/28 PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
2018/07/31 PHP
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
基于jquery实现的表格分页实现代码
2011/06/21 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
js倒计时显示实例
2016/12/11 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
canvas实现刮刮卡效果
2017/03/14 Javascript
JQuery Ajax 异步操作之动态添加节点功能
2017/05/24 jQuery
axios使用拦截器统一处理所有的http请求的方法
2018/11/02 Javascript
js计算两个时间差 天 时 分 秒 毫秒的代码
2019/05/21 Javascript
通过js示例讲解时间复杂度与空间复杂度
2019/08/06 Javascript
jQuery操作元素追加内容示例
2020/01/10 jQuery
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
Python表示矩阵的方法分析
2017/05/26 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
Python后台管理员管理前台会员信息的讲解
2019/01/28 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
HTML5之WebGL 3D概述(上)—WebGL原生开发开启网页3D渲染新时代
2013/01/31 HTML / CSS
Calzedonia美国官网:意大利风格袜子、打底裤和沙滩装
2018/07/19 全球购物
澳大利亚著名的纺织品品牌:Canningvale
2020/05/05 全球购物
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
上班看电影检讨书
2014/02/12 职场文书
校优秀毕业生主要事迹
2014/05/26 职场文书
市场营销专业自荐书
2014/06/10 职场文书
法英专业大学生职业生涯规划书范文
2014/09/22 职场文书
九九重阳节标语
2014/10/07 职场文书
2014个人年度工作总结范文
2014/12/24 职场文书
战马观后感
2015/06/08 职场文书
公司年会晚会开幕词
2019/04/02 职场文书
nginx+lua单机上万并发的实现
2021/05/31 Servers
Python中的程序流程控制语句
2022/02/24 Python
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL