对于IO密集型任务,很适合用线程池来处理消息,具体思路如下:

1、创建一个Queue队列

import Queuequeue = Queue.Queue()

2、写一个类,继承线程类,重写run方法处理队列中方法和参数,由于queue是线程安全的,因此这块不必加锁;同时,创建一个线程池:

from threading import Threadfor i in range(thread_num):debug_logger.info("开启第%s个处理线程" % i)thread = ThreadManger(queue)thread.start()
class ThreadManger(Thread):

    def __init__(self, queue):        super(ThreadManger, self).__init__()        self.queue = queue

    def run(self):        while True:            if self.queue.qsize() > 0:                method, para = self.queue.get(timeout=5.0)                method(para)                self.queue.task_done()

3、将要处理的参数和处理这个参数的方法放进这个队列里,注意将参数和方法组成个元组放进去,这块也可以做成多线程,使用上面创建的queue就行

queue.put((method, parament))

4、这个时候一个简单的线程池就做好了,当队列是空的时候,线程池从queue取不到东西但线程不会结束,一旦有新的内容放到了queue中,线程池会立马取出来并处理掉

5、线程池大小,对于IO密集型的任务,假如cpu处理时间是0.5s,IO时间是1.5s,那线程池的个数为((1.5+0.5)/0.5)*核数+1

6、对于计算密集型的任务,由于GIL导致任何时候只能有一个线程在执行,所以就不要搞并发了,由于线程的切换耗费的时间会导致执行起来比单线程还慢

7、对于分布式任务,可以考虑使用mq,比如kafka或者rabbitmq

转载于:https://www.cnblogs.com/Adonis-SUN/p/8529951.html

python使用queue和线程池相关推荐

  1. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自 Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mul ...

  2. python爬取使用线程池出现报错:exception calling callback for #x3c;Future at 0x1e8e963ef70 state=finished raised

    python爬取使用线程池出现报错:exception calling callback for <Future at 0x1e8e963ef70 state=finished raised T ...

  3. Python并发编程之线程池/进程池

    引言 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我 ...

  4. 并发编程 - 线程 - 1.线程queue/2.线程池进程池/3.异步调用与回调机制

    1.线程queue :会有锁 q=queue.Queue(3) q.get() q.put() 先进先出 队列后进先出 堆栈优先级队列 1 """先进先出 队列" ...

  5. Python多线程之构建线程池

    在做爬虫项目时,假设获取一个页面的时间为3秒,一共需要获取10个页面,总时间也就是30秒,但是如果采用线程池,可以把总时间压缩到3秒!因为这10个页面是并行下载的(宏观是并行,微观仍然串行,只是CPU ...

  6. python运行原理_Python线程池及其原理和使用(超级详细)

    系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 线程池在系统启动时即 ...

  7. Python 为什么要用线程池?

    一.为什么要使用线程池 多线程的情况下确实可以最大限度发挥多核处理器的计算能力,提高系统的吞吐量和性能. 但是如果随意使用多线程,对系统的性能反而有不利影响. 比如下面的情况: 创建线程是需要时间的, ...

  8. Python爬虫:使用线程池快速下载视频

    旁白:上一篇利用python爬取了虎牙星秀的图片,这一篇利用线程池对视频进行爬取. 文章目录 前言 一.为什么要使用线程池? 二.使用步骤 1.引入模块 2.创建文件夹 3.存储文件 4.完整代码 三 ...

  9. Python爬虫实战 使用线程池批量爬取必应1080P高清壁纸

    本文纯粹为了技术学习,内容如有侵权,请告知! 目标URL:https://bing.ioliu.cn 爬取的图片 Python用到的主要模块 import requests from lxml imp ...

  10. python异步爬虫之线程池

    单线程不足之处 当对多个url发送请求时,只有请求完第一个url才会接着请求第二个url(requests是一个阻塞的操作),比如下载图片,这种一个个执行的方式称为单线程.其存在等待的时间,这样效率是 ...

最新文章

  1. How to install sougoupinyin on Debian/Ubuntu.
  2. linux定时脚本任务
  3. JS中的事件冒泡——总结
  4. python 制作二进制文件数据集(bin)
  5. mysql数据库存储引擎和索引的描述_Mysql InnoDB引擎的索引与存储结构详解
  6. perl语言学习笔记(3)列表与数组、子程序’、参数
  7. pytorch flatten函数_1. PyTorch中的基本数据类型——张量
  8. TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的关系与区别
  9. 微信内测“群直播”;小米发布第三代屏下相机技术;马斯克宣布脑机接口重大突破 | 极客头条...
  10. 【BZOJ2154】Crash的数字表格 [莫比乌斯反演]
  11. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_5_BufferedWriter_字符缓冲输出流...
  12. 在.net中使用GAC
  13. 逆向分析商业软件 010 Editor 及注册机编写
  14. Hybrid Trajectory Planning for Autonomous Driving in On-Road Dynamic Scenarios文章解读
  15. DNS 文件传输协议
  16. 深入理解java虚拟机之——垃圾回收(垃圾判断,垃圾收集算法,垃圾收集器)
  17. 常用127个ASK码对照表
  18. xshell调用js脚本开发
  19. Android Studio常用快捷键
  20. 如何优化网站代码SEO更好?

热门文章

  1. 「leetcode」486. 预测赢家:【三种递归+动态规划】由浅入深,步步到位
  2. Axure RP 8 for Mac(交互式原型设计工具)汉化版
  3. 如何在macOS Monterey、iOS 15 中使用Apple Notes标签?
  4. MacOS如何设置不使用时退出登录用户账号
  5. 自定义Mac睡眠时间,保持运行状态
  6. 中国云计算进入全球通时代 阿里云四大海外数据中心相继开服
  7. BZOJ 3675 APIO2014 序列切割 斜率优化DP
  8. 软件测试(三)——lab 1
  9. perl Makefile.PL;make;make install 安装时报错
  10. 监控数据库锁阻塞_机器连接数_警报日志的shell脚本 分享