01-gevent完成多任务
gevent完成多任务
一、原理
gevent实现多任务并不是依靠多进程或是线程,执行的时候只有一个线程,在遇到堵塞的时候去寻找可以执行的代码。本质上是一种协程。
二、代码实现
import gevent def f1(n):
for i in range(n):
print(gevent.getcurrent(), i)
gevent.sleep(0.5) def f2(n):
for i in range(n):
print(gevent.getcurrent(), i)
gevent.sleep(0.5) def f3(n):
for i in range(n):
print(gevent.getcurrent(), i)
gevent.sleep(0.5) # 创建gevent对象,spawn()函数中的第二个参数是前面需要执行的函数中需要传入的参数
# 此时仅仅是创建对象并没有执行
g1 = gevent.spawn(f1, 5)
g2 = gevent.spawn(f1, 5)
g3 = gevent.spawn(f1, 5) # 调用join()函数的时候才开始执行
g1.join()
g2.join()
g3.join()
解读:
程序从上往下执行,在执行到g1.join()的时候,会去执行对应的函数,这个函数在执行的过程中会出现堵塞现象。在这个时候程序并不会一直在那里等待,而是回去继续寻找其他的gevent创建的对象,继续执行代码。在这个程序里面,会继续执行g2.join(),依此类推,后面代码的执行情况和这个一样。(这点就像是异步I/O)
注意:
- gevent.spawn()---------->用于创建gevent对象,并没有执行函数
- g1.join()---------->此时才开始执行对应的函数
- 在gevent()中要想有sleep()造成的堵塞,必须使用gevent.sleep()。(前提是没有打补丁)
三、gevent打补丁
# 打补丁,导入这个模块,并执行指定的函数,那么遇到需要耗时的操作都会将其替换成gevent()中的耗时操作
from gevent import monkey
monkey.patch_all()
打完补丁之后可以使用time.sleep()
def f1(n):
for i in range(n):
print(gevent.getcurrent(), i)
time.sleep(0.5)
如上面代码所示,将完整代码中的gevent.sleep()全部替换为time.sleep()效果不会发生改变
四、更简单的输出方式
观察上面的程序,我们发现在调用gevent创建的对象的时候,代码过于冗长。加入创建了一百个gevent对象,那岂不是要写一百个join()函数。
为了解决这个问题,gevent给我们提供了一个joinall()函数。
语法如下:
gevent.joinall([
gevent.spawn(functionname1),
gevent.spawn(functionname2),
gevent.spawn(functionname3)
])
对上面咱们已经写好的代码进行如下修改,修改完成之后代码执行效果不变。
gevent.joinall([
gevent.spawn(f1, 5),
gevent.spawn(f2, 5),
gevent.spawn(f3, 5)
])
五、gevent实现图片下载器
import gevent
import urllib.request
from gevent import monkey monkey.patch_all() def img_download(img_name, img_url):
req = urllib.request.urlopen(img_url) # 获取的是响应状态
content = req.read()
with open(img_name, "wb") as f:
f.write(content) def main():
gevent.joinall([
gevent.spawn(img_download, "1.jpg", "http://n.sinaimg.cn/photo/transform/700/w1000h500/20211002/3c9c-4fecc919c8af637a9f6cc7c82b4cf3bc.jpg"),
gevent.spawn(img_download, "2.jpg" , "https://n.sinaimg.cn/photo/400/w200h200/20210416/a6a4-knvsnuf5950596.jpg")
]) if __name__ == "__main__":
main()
01-gevent完成多任务的更多相关文章
- Python 使用gevent实现多任务
import gevent import time # 如果需要默认的 time.sleep(0.5) 需要打补丁 from gevent import monkey monkey.patch_all ...
- 多任务5-协程(IO密集型适用)--gevent完成多任务及monkey补丁
代码: import gevent def f1(n): for i in range(n): print(gevent.getcurrent(),i) gevent.sleep(1) def f2( ...
- Python多任务之协程
前言 协程的核心点在于协程的使用,即只需要了解怎么使用协程即可:但如果你想了解协程是怎么实现的,就需要了解依次了解可迭代,迭代器,生成器了: 如果你只想看协程的使用,那么只需要看第一部分内容就行了:如 ...
- python多任务的实现:线程,进程,协程
什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务.打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行.还有很多任务悄悄地在后 ...
- python多任务——协程的使用
使用yield完成多任务 import time def test1(): while True: print("--1--") time.sleep(0.5) yield Non ...
- python就业班-淘宝-目录.txt
卷 TOSHIBA EXT 的文件夹 PATH 列表卷序列号为 AE86-8E8DF:.│ python就业班-淘宝-目录.txt│ ├─01 网络编程│ ├─01-基本概念│ │ 01-网络通信概述 ...
- python高级编程之 web静态服务器
返回固定数据 import socket def request_handler(new_client_socket): """ 响应客户端请求的核心函数 "& ...
- 多任务-python实现-gevent(2.1.15)
@ 目录 1.说明 2.代码 关于作者 1.说明 上个博文携程实现的多任务 依然是一个进程,一个线程,只不过执行了不同的代码部分 这里使用gevent,或者greenlet 当gevent执行的时候遇 ...
- 戴文的Linux内核专题:01介绍
转自Linux中国 译者按:本文作者戴文.科利尔.约翰逊(Devyn Collier Johnson)今年才19岁,但是他在Linux内核.人工智能.编程语言方面拥有丰富的经验,本文是其在linux. ...
随机推荐
- Insights直播回顾,对话专家,HMS Core 6创新能力解读
HMS Core Insights第八期直播–对话专家,HMS Core 6创新能力解读,已于11月25日圆满结束,本期直播与小伙伴们一同了解了HMS Core 6在图形.媒体以及连接与通信领域推出的 ...
- Codeforces 1519F - Chests and Keys(暴搜+以网络流为状态的 dp)
Codeforces 题目传送门 & 洛谷题目传送门 难度终于出来了--又独立切掉一道 *3200,凯信(所以我已经独立切掉三道 *3200 了?) 首先考虑我们已经知道了每个宝箱上有哪些锁, ...
- 如何利用efetch从NCBI中批量下载数据?
目录 找序列 下序列 假设我要从NCBI中下载全部水稻的mRNA序列,如何实施? 找序列 第一步,肯定是找到相关序列. 我从ncbi taxonomy进入,搜索oryza.因为要搜索mRNA核酸序列, ...
- PPT——一个有情怀的免费PPT模板下载网站!“优品PPT”
http://www.ypppt.com/ PS:再推荐一款免费PPT下载网站 https://www.v5ppt.com/ppt-5-42-1.html
- 简单mvc框架核心笔记
简单mvc框架核心笔记 看了thinkphp5的源码,模仿写了一个简单的框架,有一些心得笔记,记录一下 1.目录结构 比较简单,没有tp那么复杂,只是把需要的核心类写了一些. 核心类库放在mykj里, ...
- 计算机网络-4-7-内部网关协议OSPF
内部网关协议OSPF(开放最短路径优先) 出现的原因:为了克服RIP协议的缺点在1989年开发出来,**开放 表明OSPF协议不受任何厂家的限制.最短路径优先是因为使用了最短路径算法SPF**. OS ...
- 业务逻辑审批流、审批流、业务、逻辑、面向对象、工作方式【c#】
------需求分析:--------1.先按照实际线下流程说这是什么事情,实际要干什么.2.再转换为面向对象-页面的操作流程,演示demo3.再与相关人员沟通是否可行需要什么地方修正.4.最终:线上 ...
- 8 — springboot中静态资源处理方式 - 前后端分离 这没屁用
7中说了thymeleaf,哪还有一个目录是static 那么就来研究一下静态资源 静态资源,springboot底层是怎么去装配的,都在WebMvcAutoConfiguration有答案,去看一下 ...
- javaSE中级篇2 — 工具类篇 — 更新完毕
1.工具类(也叫常用类)-- 指的是别人已经写好了的,我们只需要拿来用就行了 官网网址:Overview (Java Platform SE 8 ) (oracle.com) ---- 但是这个是英文 ...
- 为 Rainbond Ingress Controller 设置负载均衡
Rainbond 作为一款云原生应用管理平台,天生带有引导南北向网络流量的分布式网关 rbd-gateway.rbd-gateway 组件,实际上是好雨科技团队开发的一种 Ingress Contro ...