Python实现线程池

最近在做一些文本处理方面的事情,考虑到程序利用并发性可以提高执行效率(不纠结特殊反例),于是入围的Idea如使用多进程或多线程达到期望的目标,对于进程或线程的创建是有代价的,那么我们是否可以实现一个线程池来达到已创建的线程反复使用从而使代价降低到最小呢?

当然可以,要想创建一个线程池,那么必须得有个容器来模拟“池”,在Python中,队列这样的数据结构就可以帮我们解决“池”这个问题,然而随之引来的
多线程之间数据处理同步问题,好在Python中有个Queue模块帮我们解决了这一棘手的问题,那么我们就可以实现一个线程池的雏形了。
Python代码  收藏代码

# !/usr/bin/env python 
    # -*- coding:utf-8 -*- 
     
    import Queue 
    import threading 
    import time 
     
    class WorkManager(object): 
        def __init__(self, work_num=1000,thread_num=2): 
            self.work_queue = Queue.Queue() 
            self.threads = [] 
            self.__init_work_queue(work_num) 
            self.__init_thread_pool(thread_num) 
     
        """
            初始化线程
        """ 
        def __init_thread_pool(self,thread_num): 
            for i in range(thread_num): 
                self.threads.append(Work(self.work_queue)) 
     
        """
            初始化工作队列
        """ 
        def __init_work_queue(self, jobs_num): 
            for i in range(jobs_num): 
                self.add_job(do_job, i) 
     
        """
            添加一项工作入队
        """ 
        def add_job(self, func, *args): 
            self.work_queue.put((func, list(args)))#任务入队,Queue内部实现了同步机制 
     
        """
            等待所有线程运行完毕
        """    
        def wait_allcomplete(self): 
            for item in self.threads: 
                if item.isAlive():item.join() 
     
    class Work(threading.Thread): 
        def __init__(self, work_queue): 
            threading.Thread.__init__(self) 
            self.work_queue = work_queue 
            self.start() 
     
        def run(self): 
            #死循环,从而让创建的线程在一定条件下关闭退出 
            while True: 
                try: 
                    do, args = self.work_queue.get(block=False)#任务异步出队,Queue内部实现了同步机制 
                    do(args) 
                    self.work_queue.task_done()#通知系统任务完成 
                except: 
                    break 
     
    #具体要做的任务 
    def do_job(args): 
        time.sleep(0.1)#模拟处理时间 
        print threading.current_thread(), list(args) 
     
    if __name__ == '__main__': 
        start = time.time() 
        work_manager =  WorkManager(10000, 10)#或者work_manager =  WorkManager(10000, 20) 
        work_manager.wait_allcomplete() 
        end = time.time() 
        print "cost all time: %s" % (end-start)

2次开启不同的线程数运行结果如下:
Python代码  收藏代码

#work_manager =  WorkManager(10000, 10) 
    cost all time: 100.641790867(单位:秒) 
    #work_manager =  WorkManager(10000, 20) 
    cost all time:50.5233478546(单位:秒)

上面实现了线程池的雏形,展现了基本原理,当然要想成为通用的API需要做很多的工作,希望本文能够起到抛砖引玉的效果。

Python实现线程池相关推荐

  1. Python之路【第八篇】python实现线程池

    线程池概念 什么是线程池? 诸如web服务器.数据库服务器.文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务. 构建服务器应用程序的一个过于简单的模型是:每当一个请求到 ...

  2. python停止线程池_详解python中Threadpool线程池任务终止示例代码

    需求 加入我们需要处理一串个位数(0~9),奇数时需要循环打印它:偶数则等待对应时长并完成所有任务:0则是错误,但不需要终止任务,可以自定义一些处理. 关键点 定义func函数处理需求 callbac ...

  3. python结束线程池正在运行的线程_python之线程与线程池

    #进程是资源分配的最小单位,线程是CPU调度的最小单位.每一个进程中至少有一个线程.#传统的不确切使用线程的程序称为只含有一个线程或单线程程序,而可以使用线程的程序被称为多线程程序,在程序中使用一个线 ...

  4. python ThreadPoolExecutor线程池(实例)

    初识 Python中已经有了threading模块,为什么还需要线程池呢,线程池又是什么东西呢?在介绍线程同步的信号量机制的时候,举得例子是爬虫的例子,需要控制同时爬取的线程数,例子中创建了20个线程 ...

  5. python threadpoolexecutor_Python线程池ThreadPoolExecutor实践

    Python线程池ThreadPoolExecutor实践 2019年5月15日 23:00 by wst python高级 在使用ThreadPoolExecutor的过程中,一直想探索线程池会使用 ...

  6. python threadpoolexecutor_python线程池ThreadPoolExecutor用法

    线程池,进程池 python的多线程并不是完全鸡肋的存在,得分情况来看.在IO密集型任务下,能提高多倍效率.在CPU密集型任务下,使用多进程也能规避GIL锁. python3标准库concurrent ...

  7. Python ThreadPoolExecutor线程池

    概念 Python中已经有了threading模块,为什么还需要线程池呢,线程池又是什么东西呢?以爬虫为例,需要控制同时爬取的线程数,例子中创建了20个线程,而同时只允许3个线程在运行,但是20个线程 ...

  8. python使用线程池多线程执行,并得到返回的结果

    多线程的使用场景比如:频繁数据库连接,频繁的资源读取(如频繁读文件.玩命读kafka什么的) 多线程:适合IO密集型 多进程:适合计算密集型 使用线程池的好处是自动管理线程,不会导致线程资源浪费和代码 ...

  9. Python运用线程池ThreadPoolExecutor多线程下载搜索图片

    用chrome解析某搜索网站图片搜索请求包,再参考网上一些已有的代码,在vscode+python3.7环境,多线程下载搜索结果页面上图片的代码,其中加入了键盘中止和ThreadPoolExecuto ...

最新文章

  1. SSL应用系列之二:为Web站点实现SSL加密访问
  2. projecteuler_problem6
  3. 利用PowerShell进行数据库部署冒烟测试
  4. OpenCV findContours和drawContours用法的实例(附完整代码)
  5. 降低成本,提高生产力—8句话讲清RPA的部署
  6. SAP CRM和SAP Hybris的订单日志
  7. 以表达式作为参数传入SQL的存储过程中去
  8. EventEmitter
  9. linux安装了xml怎么编译,linux下libxml库的安装及编译
  10. http://www.zhihu.com/question/24896283
  11. MySQL 表分区功能详解
  12. 概率论与数理统计——贝塞尔校正(Bessel‘s Correction)
  13. 斗鱼mac html5,斗鱼html5插件
  14. avr 运行 linux,linux(ubuntu9.04)安装avr编译环境
  15. 二手房各项税费计算公式
  16. Orcle中Database Control - orcl打开错误或者打不开的解决办法
  17. Mac下的Adobe卸载后无法重装
  18. 微信小程序:点击图片进行预览
  19. 1.pygame简介
  20. demonstration记忆_记忆单词的方法

热门文章

  1. live2d模型_使用二次元模型动画人物让自己网站“骚起来”
  2. kafka数据丢失的场景
  3. php 点击表头排序,TP5+ajax实现点击表格表头切换排序,带分页
  4. php 去除首位字符_php中如何去除字符串首尾字符?
  5. android代码修改excel文件格式,Android实现类似execel的表格 能回显并能修改表格内容的方法...
  6. 浅谈Python flask框架浅析
  7. ACM寒假训练第一周总结
  8. python 靶心_手把手教你使用Python实战反欺诈模型|原理+代码
  9. 【PHPExcel】设置打印格式
  10. python yield用法_Python中迭代器和生成器的区别?