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 编码处理-str与Unicode的区别
Sep 06 Python
利用python微信库itchat实现微信自动回复功能
May 18 Python
简单了解为什么python函数后有多个括号
Dec 19 Python
python中resample函数实现重采样和降采样代码
Feb 25 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
Mar 09 Python
Django之choices选项和富文本编辑器的使用详解
Apr 01 Python
基于python 取余问题(%)详解
Jun 03 Python
在Python中字典按值排序的实现方法
Nov 12 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
Feb 05 Python
浅谈Python数学建模之线性规划
Jun 23 Python
python中super()函数的理解与基本使用
Aug 30 Python
Python机器学习应用之基于线性判别模型的分类篇详解
Jan 18 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 iconv 函数转gb2312的bug解决方法
2009/10/11 PHP
《PHP编程最快明白》第七讲:php图片验证码与缩略图
2010/11/01 PHP
PHP遍历二维数组的代码
2011/04/22 PHP
PHP中通过trigger_error触发PHP错误示例
2015/06/23 PHP
php制作简单模版引擎
2016/04/07 PHP
php集成动态口令认证
2016/07/21 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
2017/10/06 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
学习ExtJS(一) 之基础前提
2009/10/07 Javascript
基于javascript 闭包基础分享
2013/07/10 Javascript
JQuery之focus函数使用介绍
2013/08/20 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐)
2016/06/23 Javascript
IntersectionObserver API 详解篇
2016/12/11 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
搭建简单的nodejs http服务器详解
2017/03/09 NodeJs
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
xmlplus组件设计系列之树(Tree)(9)
2017/05/02 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
[02:56]DOTA2上海特锦赛小组赛解说FreeAgain采访花絮
2016/02/27 DOTA
Python random模块(获取随机数)常用方法和使用例子
2014/05/13 Python
启动targetcli时遇到错误解决办法
2017/10/26 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
用django-allauth实现第三方登录的示例代码
2019/06/24 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
python如何实现单链表的反转
2020/02/10 Python
Python写出新冠状病毒确诊人数地图的方法
2020/02/12 Python
Python json读写方式和字典相互转化
2020/04/18 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
英国最大的线上保健品零售商之一:Vitamin Planet
2016/12/01 全球购物
舞会礼服和舞会鞋:PromGirl
2019/04/22 全球购物
伊索寓言教学反思
2014/05/01 职场文书
庆国庆活动总结
2014/08/28 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
小学教师师德培训心得体会
2016/01/09 职场文书
浅谈Python 中的复数问题
2021/05/19 Python