python使用queue和线程池
对于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和线程池相关推荐
- 《转载》Python并发编程之线程池/进程池--concurrent.futures模块
本文转载自 Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mul ...
- python爬取使用线程池出现报错:exception calling callback for #x3c;Future at 0x1e8e963ef70 state=finished raised
python爬取使用线程池出现报错:exception calling callback for <Future at 0x1e8e963ef70 state=finished raised T ...
- Python并发编程之线程池/进程池
引言 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我 ...
- 并发编程 - 线程 - 1.线程queue/2.线程池进程池/3.异步调用与回调机制
1.线程queue :会有锁 q=queue.Queue(3) q.get() q.put() 先进先出 队列后进先出 堆栈优先级队列 1 """先进先出 队列" ...
- Python多线程之构建线程池
在做爬虫项目时,假设获取一个页面的时间为3秒,一共需要获取10个页面,总时间也就是30秒,但是如果采用线程池,可以把总时间压缩到3秒!因为这10个页面是并行下载的(宏观是并行,微观仍然串行,只是CPU ...
- python运行原理_Python线程池及其原理和使用(超级详细)
系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 线程池在系统启动时即 ...
- Python 为什么要用线程池?
一.为什么要使用线程池 多线程的情况下确实可以最大限度发挥多核处理器的计算能力,提高系统的吞吐量和性能. 但是如果随意使用多线程,对系统的性能反而有不利影响. 比如下面的情况: 创建线程是需要时间的, ...
- Python爬虫:使用线程池快速下载视频
旁白:上一篇利用python爬取了虎牙星秀的图片,这一篇利用线程池对视频进行爬取. 文章目录 前言 一.为什么要使用线程池? 二.使用步骤 1.引入模块 2.创建文件夹 3.存储文件 4.完整代码 三 ...
- Python爬虫实战 使用线程池批量爬取必应1080P高清壁纸
本文纯粹为了技术学习,内容如有侵权,请告知! 目标URL:https://bing.ioliu.cn 爬取的图片 Python用到的主要模块 import requests from lxml imp ...
- python异步爬虫之线程池
单线程不足之处 当对多个url发送请求时,只有请求完第一个url才会接着请求第二个url(requests是一个阻塞的操作),比如下载图片,这种一个个执行的方式称为单线程.其存在等待的时间,这样效率是 ...
最新文章
- How to install sougoupinyin on Debian/Ubuntu.
- linux定时脚本任务
- JS中的事件冒泡——总结
- python 制作二进制文件数据集(bin)
- mysql数据库存储引擎和索引的描述_Mysql InnoDB引擎的索引与存储结构详解
- perl语言学习笔记(3)列表与数组、子程序’、参数
- pytorch flatten函数_1. PyTorch中的基本数据类型——张量
- TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的关系与区别
- 微信内测“群直播”;小米发布第三代屏下相机技术;马斯克宣布脑机接口重大突破 | 极客头条...
- 【BZOJ2154】Crash的数字表格 [莫比乌斯反演]
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_5_BufferedWriter_字符缓冲输出流...
- 在.net中使用GAC
- 逆向分析商业软件 010 Editor 及注册机编写
- Hybrid Trajectory Planning for Autonomous Driving in On-Road Dynamic Scenarios文章解读
- DNS 文件传输协议
- 深入理解java虚拟机之——垃圾回收(垃圾判断,垃圾收集算法,垃圾收集器)
- 常用127个ASK码对照表
- xshell调用js脚本开发
- Android Studio常用快捷键
- 如何优化网站代码SEO更好?
热门文章
- 「leetcode」486. 预测赢家:【三种递归+动态规划】由浅入深,步步到位
- Axure RP 8 for Mac(交互式原型设计工具)汉化版
- 如何在macOS Monterey、iOS 15 中使用Apple Notes标签?
- MacOS如何设置不使用时退出登录用户账号
- 自定义Mac睡眠时间,保持运行状态
- 中国云计算进入全球通时代 阿里云四大海外数据中心相继开服
- BZOJ 3675 APIO2014 序列切割 斜率优化DP
- 软件测试(三)——lab 1
- perl Makefile.PL;make;make install 安装时报错
- 监控数据库锁阻塞_机器连接数_警报日志的shell脚本 分享