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静态方法实例
Jan 14 Python
举例讲解Python程序与系统shell交互的方式
Apr 09 Python
Python实现对PPT文件进行截图操作的方法
Apr 28 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
Nov 09 Python
python 网络爬虫初级实现代码
Feb 27 Python
python类:class创建、数据方法属性及访问控制详解
Jul 25 Python
10个Python小技巧你值得拥有
Sep 29 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
May 10 Python
Python爬取豆瓣视频信息代码实例
Nov 16 Python
PyCharm使用之配置SSH Interpreter的方法步骤
Dec 26 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
May 11 Python
python中validators库的使用方法详解
Sep 23 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实现rc4加密算法代码
2012/04/25 PHP
ThinkPHP文件上传实例教程
2014/08/22 PHP
php过滤表单提交的html等危险代码
2014/11/03 PHP
10个php函数实用却不常见
2015/10/13 PHP
PHP 7的一些引人注目的新特性简单介绍
2015/11/08 PHP
JavaScript 页面编码与浏览器类型判断代码
2010/06/03 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
JS操作HTML自定义属性的方法
2015/02/10 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
2015/02/23 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
jQuery简单实现彩色云标签效果示例
2016/08/01 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
2016/11/03 Javascript
JS中from 表单序列化提交的代码
2017/01/20 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
基于vue-ssr服务端渲染入门详解
2018/01/08 Javascript
React BootStrap用户体验框架快速上手
2018/03/06 Javascript
vuex state及mapState的基础用法详解
2018/04/19 Javascript
微信小程序实现上传word、txt、Excel、PPT等文件功能
2019/05/23 Javascript
vue eslint简要配置教程详解
2019/07/26 Javascript
python迭代器的使用方法实例
2013/11/21 Python
python time模块用法实例详解
2014/09/11 Python
Python列表list数组array用法实例解析
2014/10/28 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
用Python实现筛选文件脚本的方法
2018/10/27 Python
python 获取一个值在某个区间的指定倍数的值方法
2018/11/12 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
python 实现在shell窗口中编写print不向屏幕输出
2020/02/19 Python
Python 找出英文单词列表(list)中最长单词链
2020/12/14 Python
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
校本教研工作制度
2014/01/22 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
安娜卡列尼娜观后感
2015/06/11 职场文书
关爱留守儿童主题班会
2015/08/13 职场文书
体育教师教学随笔
2015/08/15 职场文书
2016大一新生入学教育心得体会
2016/01/23 职场文书