对于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. Linux下利用rsync实现多服务器文件同步
  2. php service原理,轻松搞懂WebService工作原理
  3. 【Git、GitHub、GitLab】七 git中分支的删除以及出现分离头指针的情况
  4. 树莓派 HC-SRO4超声波测距模块的使用
  5. 如何防止SWF文件被反编译
  6. 复旦大学《高等代数学习指导书(第三版)》勘误表
  7. 史上最全的MathCAD安装教程
  8. Spring Cloud Alibaba之服务治理Nacos
  9. Linux下载神器XDM
  10. win7局域网拷贝其他计算机文件,局域网共享,教您win7局域网文件共享怎么设置
  11. 4.16周赛---玩游戏
  12. 项目经理应该如何制定项目进度计划?
  13. 基于CORBA规范的中间件——CORBA基本原理
  14. 数组(一维数组与二维数组)
  15. 如何使用Excel管理项目?
  16. 小学二年级计算机课游戏,小学二年级适合玩的课堂游戏
  17. 软件外包项目管理4 - 项目计划
  18. ThinkPHP 入门
  19. 区块链革命,革的是哪些“黑中介”的命?
  20. android+m3+max,Android Opencore OpenMAX学习(3)...

热门文章

  1. hdu 4908 BestCoder Sequence
  2. 苹果mac虚拟机软件:Parallels Desktop 17(pd虚拟机)Intel专用版
  3. 如何帮卡住的 iPhone 强制还原? Tenorshare ReiBoot 只需四步实现 iPhone 重装
  4. iOS开发之TableView去掉单个cell的间隔线和去掉全部间隔线和去掉tableView多余的间隔线
  5. M1 Mac上运行Windows 11
  6. 如何向Mac Dictionary App添加其他语言
  7. web 实现分页打印功能
  8. 动态规划------平均切分数组之和为两部分
  9. display和float使用上的区别(1)-----多栏布局的实现
  10. [转]Python中RE模块的应用