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 04 Python
Python给你的头像加上圣诞帽
Jan 04 Python
用python写扫雷游戏实例代码分享
May 27 Python
django做form表单的数据验证过程详解
Jul 26 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
Aug 08 Python
用python实现英文字母和相应序数转换的方法
Sep 18 Python
python实现从尾到头打印单链表操作示例
Feb 22 Python
使用python3 实现插入数据到mysql
Mar 02 Python
python实现跨excel sheet复制代码实例
Mar 03 Python
Python网页解析器使用实例详解
May 30 Python
python的json包位置及用法总结
Jun 21 Python
OpenCV全景图像拼接的实现示例
Jun 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
配置支持SSI
2006/11/25 PHP
实用函数9
2007/11/08 PHP
PHP 获取远程文件内容的函数代码
2010/03/24 PHP
非常好用的两个PHP函数 serialize()和unserialize()
2012/02/04 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
smarty模板引擎之分配数据类型
2015/03/30 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
PHP实现的策略模式简单示例
2017/08/25 PHP
document.all与WEB标准
2020/05/13 Javascript
JQuery 写的个性导航菜单
2009/12/24 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
轻松学习jQuery插件EasyUI EasyUI创建菜单与按钮
2015/11/30 Javascript
JavaScript jQuery 中定义数组与操作及jquery数组操作
2015/12/18 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
2016/01/15 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
2016/03/16 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
AngularJS ui-router刷新子页面路由的方法
2018/07/23 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
如何根据业务封装自己的功能组件
2019/04/19 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
2019/09/09 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
Python如何实现MySQL实例初始化详解
2017/11/06 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
2017/12/19 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
食堂个人先进事迹
2014/01/22 职场文书
幼儿园教师获奖感言
2014/03/11 职场文书
一帮一活动总结
2014/05/08 职场文书
2014年党课学习材料
2014/05/11 职场文书
态度决定一切演讲稿
2014/05/20 职场文书
2014年心理健康教育工作总结
2014/12/06 职场文书
英文感谢信格式
2015/01/21 职场文书
vue实现同时设置多个倒计时
2021/05/20 Vue.js