目标

  • 掌握gevent中Pool基本使用
  • 实现代码的重构,使用gevent来进一步提高效率

1 为什么使用gevent

对于I/O密集型任务,gevent能对性能做很大提升的,协程的创建、调度开销都比线程小的多。

2 通过配置文件设置属性,来判断所使用的异步方式

# 异步方式  thread、coroutine
ASYNC_TYPE = 'coroutine'

3 让gevent的Pool和线程池Pool的接口一致

因此需要单独对gevent的Pool进行一下修改,具体如下: 在scrapy_plus下创建async包,随后创建coroutine.py模块

# scrapy_plus/async/coroutine.py
'''
由于gevent的Pool的没有close方法,也没有异常回调参数
引出需要对gevent的Pool进行一些处理,实现与线程池一样接口,实现线程和协程的无缝转换
'''
from gevent.pool import Pool as BasePool
import gevent.monkey
gevent.monkey.patch_all()    # 打补丁,替换内置的模块class Pool(BasePool):'''协程池使得具有close方法使得apply_async方法具有和线程池一样的接口'''def apply_async(self, func, args=None, kwds=None, callback=None, error_callback=None):return super().apply_async(func, args=args, kwds=kwds, callback=callback)def close(self):'''什么都不需要执行'''pass

4 在引擎中使用上:

# scrapy_plus/core/engine.py
import time
import importlib
from datetime import datetimefrom scrapy_plus.http.request import Request    # 导入Request对象
from scrapy_plus.utils.log import logger    # 导入logger
from scrapy_plus.conf import settings# 判断使用什么异步模式,改用对应的异步池
if settings.ASYNC_TYPE == 'thread':from multiprocessing.dummy import Pool    # 导入线程池对象
elif settings.ASYNC_TYPE == 'coroutine':from scrapy_plus.async.coroutine import Pool
else:raise Exception("不支持的异步类型:%s, 只能是'thread'或者'coroutine'"%settings.ASYNC_TYPE)# 注意:
# 由于打patch补丁是为了替换掉socket为非阻塞的
# 而下载器中正好使用了requests模块,如果在这之后导入协程池,会导致requests中使用的socket没有被替换成功
# 从而有可能导致使用出现问题
from .scheduler import Scheduler
from .downloader import Downloaderclass Engine(object):......

使用gevent的Pool实现异步并发相关推荐

  1. python生成器单线程_【Python】迭代器、生成器、yield单线程异步并发实现详解

    转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从 ...

  2. Ajax基石脚本异步并发调用参数传递

    在Ajax开发框架中,最基本的划分是服务器端和客户端.服务器端相对来说比较简单,只要是可以开发动态网页的语言都可以胜任:客户端浏览器就是JScript/JavaScript的天下了,好像没有看到有VB ...

  3. 异步并发利器:实际项目中使用CompletionService提升系统性能的一次实践

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 场景 随着互联网应用的深入,很多传统行业也都需要接入到互联网.我们公司也是这样,保险核心需 ...

  4. boost.asio无锁异步并发

    简介 给出一个不安全的情况,假设我们有一个socket用于和用户通信,用户会发送多个请求,我们处理请求需要一定的时间,同时使用异步并发的模型来处理对应的请求,即一个io_context::run会有多 ...

  5. boost.asio异步并发Tcp服务器

    简介 boost的asio采用的是Proactor模型,该模型的核心思想就是异步IO,IO在事件循环中,每个异步IO都绑定对应的回调函数,当IO完成后,对应的回调函数会在事件循环中执行. 异步并发模型 ...

  6. Rust actix aiohttp_Actix - Rust 的Actor异步并发框架

    ## Actix - Rust 的Actor异步并发框架 ### [actix](https://github.com/actix) ### [官网](https://actix.rs/) Actix ...

  7. Java异步并发和线程池

    Java异步并发和线程池 1.一条简单粗暴的路: a.使用 parallelStream可能存在的bug b. 如何正确使用 parallelStream 2.另一条路 参考1: https://we ...

  8. 【Web系列二十】Django+Celery+Asgiref+Channels+协程锁实现Websocket异步并发

    写在前面 最近手头有一个项目需要交付,作为web项目,并发问题是不可避免的.对于Django后端,常用的并发实现方案就是Celery,虽然网上已经有不少实施例,但是实际开发过程中遇到一些问题.比如长连 ...

  9. 【Java线程】互斥 同步 异步 并发 多线程的区别与联系

    1. 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行.其中两种并发关系分别是同步和互斥: 2. 互斥:进程间相互排斥的使用临界资源的 ...

  10. gevent的同步与异步

    from gevent import spawn,joinall,monkey;monkey.patch_all() import time def task(pid):time.sleep(0.5) ...

最新文章

  1. 从乘法表JAVA意思4_四、Java从头开始-我的九九乘法表(二)
  2. hdu4415 不错的想法题
  3. matlab二维特殊函数面积图area()函数
  4. 微信公众平台开发新手教程(图文具体解释)
  5. MAX232和PL2303、CH340的区别
  6. w ndows10电脑配置看哪里,Windows10怎么自动登录?Windows10自动登录的设置方法
  7. 使用opensocial接入social game
  8. 华为P50系列即将登场:曝线下门店已开始准备样机、物料
  9. 如何在有限的时间内编写完整有效的测试用例?
  10. IBM\浪潮\Dell\HP服务器raid(磁盘阵列)配置
  11. android mapstring, string遍历,MapString, String 遍历的四种方法
  12. Python里Matplotlib的pyplot模块绘制简单图形小例子
  13. pads 2007 安装完成后, 出现 no license 的解决方法
  14. Java程序员简历这么写,还过不了筛选算我输
  15. 阿里新供应链架构解读
  16. sqrt函数实现之卡马克方法
  17. Windows环境下,输入(Chkntfs /X C:)命令可以取消系统每次启动对C盘的磁盘扫描程序
  18. 开源问答社区软件Answer
  19. 华为认证是自学还是报班合适
  20. css3实现qq制作QQ登陆界面

热门文章

  1. 解决QQ语音通话后耳机失效的问题
  2. 支付宝支付验证签名失败
  3. ASP.NET 抓取网页源文件
  4. C++ Const 初步总结(《C++程序设计语言》读后感)
  5. 关于window简体中文环境文件路径包含7种横杠的问题,及结论推广
  6. Element-Ui 双重el-tabs组件选中第二层时,刷新导致第一层选中样式丢失问题以及解决方法
  7. 微新小程序封装wx.request (使用回调函数)
  8. python 华为交换机自动配置_对python连接华为交换机批量配置优化
  9. 项目实训(十二)——FPS游戏枪械射击弹孔及子弹散射
  10. 中国大学慕课浙江大学【C语言课程】-翁恺教授第4周编程练习数字特征值(5分)