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是一个阻塞的操作),比如下载图片,这种一个个执行的方式称为单线程.其存在等待的时间,这样效率是 ...
最新文章
- Linux下利用rsync实现多服务器文件同步
- php service原理,轻松搞懂WebService工作原理
- 【Git、GitHub、GitLab】七 git中分支的删除以及出现分离头指针的情况
- 树莓派 HC-SRO4超声波测距模块的使用
- 如何防止SWF文件被反编译
- 复旦大学《高等代数学习指导书(第三版)》勘误表
- 史上最全的MathCAD安装教程
- Spring Cloud Alibaba之服务治理Nacos
- Linux下载神器XDM
- win7局域网拷贝其他计算机文件,局域网共享,教您win7局域网文件共享怎么设置
- 4.16周赛---玩游戏
- 项目经理应该如何制定项目进度计划?
- 基于CORBA规范的中间件——CORBA基本原理
- 数组(一维数组与二维数组)
- 如何使用Excel管理项目?
- 小学二年级计算机课游戏,小学二年级适合玩的课堂游戏
- 软件外包项目管理4 - 项目计划
- ThinkPHP 入门
- 区块链革命,革的是哪些“黑中介”的命?
- android+m3+max,Android Opencore OpenMAX学习(3)...
热门文章
- hdu 4908 BestCoder Sequence
- 苹果mac虚拟机软件:Parallels Desktop 17(pd虚拟机)Intel专用版
- 如何帮卡住的 iPhone 强制还原? Tenorshare ReiBoot 只需四步实现 iPhone 重装
- iOS开发之TableView去掉单个cell的间隔线和去掉全部间隔线和去掉tableView多余的间隔线
- M1 Mac上运行Windows 11
- 如何向Mac Dictionary App添加其他语言
- web 实现分页打印功能
- 动态规划------平均切分数组之和为两部分
- display和float使用上的区别(1)-----多栏布局的实现
- [转]Python中RE模块的应用