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实现协程相关推荐

  1. Python浅谈gevent实现协程

    每日一怼:垃圾桶都收到花了,你却没有 认识gevent之前我们先来认识一下协程,什么是协程? 在笔者的看来就是在A程序与B程序的反复调用执行. 当A程序执行结束后调用执行B程序,B程序结束后调用A程序 ...

  2. python并发编程之协程

    python并发编程之协程 1.协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切,整个线程都阻塞 ...

  3. python多线程多进程多协程_python 多进程、多线程、协程

    1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...

  4. python协程是什么_在python中线程和协程的区别是什么

    在python中线程和协程的区别:1.一个线程可以拥有多个协程,这样在python中就能使用多核CPU:2.线程是同步机制,而协程是异步:3. 协程能保留上一次调用时的状态,每次过程重入时,就相当于进 ...

  5. Python之进程+线程+协程(异步、selectors模块、阻塞、非阻塞IO)

    文章目录 一.IO多路复用 二.selectors模块 本篇文字是关于IO多路复用的更深入一步的总结,上一篇 Python之进程+线程+协程(事件驱动模型.IO多路复用.select与epoll)对I ...

  6. python并发编程:协程asyncio、多线程threading、多进程multiprocessing

    python并发编程:协程.多线程.多进程 CPU密集型计算与IO密集型计算 多线程.多进程与协程的对比 多线程 创建多线程的方法 多线程实现的生产者-消费者爬虫 Lock解决线程安全问题 使用线程池 ...

  7. 协程的概念及Python中利用第三方库gevent使用协程

    提到程序的并发操作,大多数人程序员首先想到的进程或者线程.我们先复习一下进程和线程的概念.   进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的 ...

  8. python gevent pool_python 协程编程之gevent

    前言:协程又称微线程,英文名coroutine.协程是用户态的一种轻量级线程,是由用户程序自己控制调度.基于这一原理,协程能在单线程下实现并发.我们知道进程是操作系统分配资源的基本单位,线程是CPU任 ...

  9. Python爬虫笔记——多协程(gevent and queue)

    1.爬取8个网站(包括百度.新浪.搜狐.腾讯.网易.爱奇艺.天猫.凤凰).用多协程gevent()模块来爬取. 这里有一个关于gevent的一些基础介绍的链接 Python并发之协程gevent基础( ...

最新文章

  1. 一个 Babelfish ,看懂云数据库的发展方向
  2. 腻害了!同事写了个隐藏 Bug,我排查了 3 天才解决问题!
  3. I/O流的概念和流类库的结构
  4. [云炬创业管理笔记]第二章成为创业者讨论2
  5. Java 中常见的异常和自定义异常
  6. php分页实例下载,PHP文件操作实例总结【文件上传、下载、分页】
  7. PyTorch深度学习实践
  8. java按钮权限控制_详解Spring Security 中的四种权限控制方式
  9. luogu P1880 [NOI1995]石子合并
  10. c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)
  11. 无法在VMware Player中安装64位系统
  12. Spring AOP/DI/IOC 简述及使用
  13. 在Word2007文档中创建数学公式——使用Word公式编辑器
  14. 数据库——MySQL——完整性约束
  15. 山东理工ACM 1115 C语言实验——交换两个整数的值(顺序结构)两种方法
  16. 如何使用excel画甘特图
  17. css 从右到左的方向调整
  18. Python人脸识别图片视频
  19. IDEA 启动项目报错 Error running 'XXXApplication': No jdk for module 'XXX'
  20. python实现labelme样本自动标注

热门文章

  1. 成长的速度一定要超过父母老去的速度
  2. mysql数据库sql语句大全
  3. linux 安装python MySQLdb
  4. history的详解与使用
  5. Java多线程-synchronized关键字
  6. 文件服务器vsftp的配置
  7. 幸福村站——成都传智播客程序猿写出你的烧烤代码
  8. com.alibaba.fastjson.JSONObject循环给同一对象赋值会出现$ref:$[0]现象问题
  9. English trip -- VC(情景课)1 D
  10. 接口测试 -- 关闭 requests 打开的 file