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编写电话薄实现增删改查功能
May 07 Python
PyTorch线性回归和逻辑回归实战示例
May 22 Python
pygame实现俄罗斯方块游戏
Jun 26 Python
wxPython的安装与使用教程
Aug 31 Python
3个用于数据科学的顶级Python库
Sep 29 Python
python 处理数字,把大于上限的数字置零实现方法
Jan 28 Python
使用Python3内置文档高效学习以及官方中文文档
May 19 Python
如何用Python做一个微信机器人自动拉群
Jul 03 Python
Python使用enumerate获取迭代元素下标
Feb 03 Python
django xadmin中form_layout添加字段显示方式
Mar 30 Python
tensorflow使用CNN分析mnist手写体数字数据集
Jun 17 Python
10张动图学会python循环与递归问题
Feb 06 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获取网页上所有链接的方法
2015/04/03 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
2016/11/12 PHP
Laravel Eloquent ORM 多条件查询的例子
2019/10/10 PHP
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
BOM与DOM的区别分析
2010/10/26 Javascript
小试JQuery的AutoComplete插件
2011/05/04 Javascript
jQuery选择器中含有空格的使用示例及注意事项
2013/08/25 Javascript
nodeType属性返回被选节点的节点类型介绍
2013/11/22 Javascript
javascript中match函数的用法小结
2014/02/08 Javascript
js中settimeout方法加参数
2014/02/28 Javascript
如何防止回车(enter)键提交表单
2014/05/11 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
2015/12/30 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
深入解析Vue 组件命名那些事
2017/07/18 Javascript
ReactNative Image组件使用详解
2017/08/07 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
优雅的处理vue项目异常实战记录
2019/06/05 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
说说如何遍历Python列表的方法示例
2019/02/11 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
Python CSV文件模块的使用案例分析
2019/12/21 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
python反编译教程之2048小游戏实例
2021/03/03 Python
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
印度尼西亚值得信赖的第一家网店:Bhinneka
2018/07/16 全球购物
Brora官网:英国领先的羊绒服装品牌
2019/08/28 全球购物
struct与class的区别
2014/02/03 面试题
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
会计试用期工作总结2015
2015/05/28 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python
理解python中装饰器的作用
2021/07/21 Python
SQL Server数据库查询出现阻塞之性能调优
2022/04/10 SQL Server