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 enumerate遍历数组示例应用
Sep 06 Python
Python删除指定目录下过期文件的2个脚本分享
Apr 10 Python
python抓取网页图片示例(python爬虫)
Apr 27 Python
python with statement 进行文件操作指南
Aug 22 Python
Python利用matplotlib生成图片背景及图例透明的效果
Apr 27 Python
Python实现删除列表中满足一定条件的元素示例
Jun 12 Python
Python之re操作方法(详解)
Jun 14 Python
python使用tornado实现简单爬虫
Jul 28 Python
python的依赖管理的实现
May 14 Python
Python: 传递列表副本方式
Dec 19 Python
Python基于类路径字符串获取静态属性
Mar 12 Python
详解Python魔法方法之描述符类
May 26 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面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
php遍历CSV类实例
2015/04/14 PHP
PHP实现多文件上传的方法
2015/07/08 PHP
yii框架使用分页的方法分析
2019/07/25 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
使用jQuery设置disabled属性与移除disabled属性
2014/08/21 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
整理AngularJS中的一些常用指令
2015/06/16 Javascript
JS动态添加iframe的代码
2015/09/14 Javascript
使用vue编写一个点击数字计时小游戏
2016/08/31 Javascript
浅谈 Vue v-model指令的实现原理
2017/06/08 Javascript
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
详解React Native 屏幕适配(炒鸡简单的方法)
2018/06/11 Javascript
vue如何解决循环引用组件报错的问题
2018/09/22 Javascript
[01:28]2014DOTA2国际邀请赛中国区预选赛四大豪门直升机抵达会场
2014/05/24 DOTA
python cookielib 登录人人网的实现代码
2012/12/19 Python
Ruby元编程基础学习笔记整理
2016/07/02 Python
解读! Python在人工智能中的作用
2017/11/14 Python
python自动发邮件库yagmail的示例代码
2018/02/23 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
Python函数基本使用原理详解
2020/03/19 Python
python实现Oracle查询分组的方法示例
2020/04/30 Python
纯css3实现图片翻牌特效
2015/03/10 HTML / CSS
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
三陽商会官方网站:Sanyo iStore
2019/05/15 全球购物
企业员工集体活动方案
2014/08/17 职场文书
2014年营销工作总结
2014/11/22 职场文书
2015年导购员工作总结
2015/04/25 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
redis实现排行榜功能
2021/05/24 Redis
Nginx反向代理、重定向
2022/04/13 Servers