python使用gevent实现协程
gevent是一个基于协程的python网络库,在遇到IO阻塞时,程序会自动进行切换,可以让我们用同步的方式写异步IO代码。
# coding:utf8 import requests import gevent from gevent import monkey monkey.patch_all() # 用于将标准库中大部分阻塞式调用修改为协作式运行def fetch(url):print("get: {}".format(url))response = requests.get(url).contentprint("{}: {}".format(url, len(response)))if __name__ == "__main__":gevent.joinall([gevent.spawn(fetch, "https://stackoverflow.com/"),gevent.spawn(fetch, "https://www.douban.com"),gevent.spawn(fetch, "https://www.github.com")])
结果为:
>>> get: https://stackoverflow.com/ >>> get: https://www.douban.com >>> get: https://www.github.com >>> https://www.douban.com: 94054 >>> https://www.github.com: 87186 >>> https://stackoverflow.com/: 261295
gevent.spawn()方法会创建一个新的greenlet协程对象,并运行它
gevent.joinall()方法的参数是一个协程对象列表,它会等待所有的协程都执行完毕后再退出
如果想获取协程返回的数据,可以这样做:
# coding:utf8 import requests import gevent from gevent import monkey monkey.patch_all() # 用于将标准库中大部分阻塞式调用修改为协作式运行def fetch(url):print("get: {}".format(url))response = requests.get(url).contentreturn url, len(response)if __name__ == "__main__":g_list = list()for url in ["https://stackoverflow.com/", "https://www.douban.com", "https://www.github.com"]:g = gevent.spawn(fetch, url)g_list.append(g)gevent.joinall(g_list)for g in g_list:print(g.value)
结果为:
>>> get: https://stackoverflow.com/ >>> get: https://www.douban.com >>> get: https://www.github.com >>> ('https://stackoverflow.com/', 260097) >>> ('https://www.douban.com', 94050) >>> ('https://www.github.com', 87180)
转载于:https://www.cnblogs.com/lucky-heng/p/10924004.html
python使用gevent实现协程相关推荐
- Python浅谈gevent实现协程
每日一怼:垃圾桶都收到花了,你却没有 认识gevent之前我们先来认识一下协程,什么是协程? 在笔者的看来就是在A程序与B程序的反复调用执行. 当A程序执行结束后调用执行B程序,B程序结束后调用A程序 ...
- python并发编程之协程
python并发编程之协程 1.协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切,整个线程都阻塞 ...
- python多线程多进程多协程_python 多进程、多线程、协程
1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...
- python协程是什么_在python中线程和协程的区别是什么
在python中线程和协程的区别:1.一个线程可以拥有多个协程,这样在python中就能使用多核CPU:2.线程是同步机制,而协程是异步:3. 协程能保留上一次调用时的状态,每次过程重入时,就相当于进 ...
- Python之进程+线程+协程(异步、selectors模块、阻塞、非阻塞IO)
文章目录 一.IO多路复用 二.selectors模块 本篇文字是关于IO多路复用的更深入一步的总结,上一篇 Python之进程+线程+协程(事件驱动模型.IO多路复用.select与epoll)对I ...
- python并发编程:协程asyncio、多线程threading、多进程multiprocessing
python并发编程:协程.多线程.多进程 CPU密集型计算与IO密集型计算 多线程.多进程与协程的对比 多线程 创建多线程的方法 多线程实现的生产者-消费者爬虫 Lock解决线程安全问题 使用线程池 ...
- 协程的概念及Python中利用第三方库gevent使用协程
提到程序的并发操作,大多数人程序员首先想到的进程或者线程.我们先复习一下进程和线程的概念. 进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的 ...
- python gevent pool_python 协程编程之gevent
前言:协程又称微线程,英文名coroutine.协程是用户态的一种轻量级线程,是由用户程序自己控制调度.基于这一原理,协程能在单线程下实现并发.我们知道进程是操作系统分配资源的基本单位,线程是CPU任 ...
- Python爬虫笔记——多协程(gevent and queue)
1.爬取8个网站(包括百度.新浪.搜狐.腾讯.网易.爱奇艺.天猫.凤凰).用多协程gevent()模块来爬取. 这里有一个关于gevent的一些基础介绍的链接 Python并发之协程gevent基础( ...
最新文章
- 一个 Babelfish ,看懂云数据库的发展方向
- 腻害了!同事写了个隐藏 Bug,我排查了 3 天才解决问题!
- I/O流的概念和流类库的结构
- [云炬创业管理笔记]第二章成为创业者讨论2
- Java 中常见的异常和自定义异常
- php分页实例下载,PHP文件操作实例总结【文件上传、下载、分页】
- PyTorch深度学习实践
- java按钮权限控制_详解Spring Security 中的四种权限控制方式
- luogu P1880 [NOI1995]石子合并
- c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)
- 无法在VMware Player中安装64位系统
- Spring AOP/DI/IOC 简述及使用
- 在Word2007文档中创建数学公式——使用Word公式编辑器
- 数据库——MySQL——完整性约束
- 山东理工ACM 1115 C语言实验——交换两个整数的值(顺序结构)两种方法
- 如何使用excel画甘特图
- css 从右到左的方向调整
- Python人脸识别图片视频
- IDEA 启动项目报错 Error running 'XXXApplication': No jdk for module 'XXX'
- python实现labelme样本自动标注
热门文章
- 成长的速度一定要超过父母老去的速度
- mysql数据库sql语句大全
- linux 安装python MySQLdb
- history的详解与使用
- Java多线程-synchronized关键字
- 文件服务器vsftp的配置
- 幸福村站——成都传智播客程序猿写出你的烧烤代码
- com.alibaba.fastjson.JSONObject循环给同一对象赋值会出现$ref:$[0]现象问题
- English trip -- VC(情景课)1 D
- 接口测试 -- 关闭 requests 打开的 file