本文对Python线程池进行详细说明介绍,IDE选择及编码的解决方案进行了一番详细的描述,实为Python初学者必读的Python学习经验心得。
 

下面给大家总结一下自己总结的对Python线程池经验之谈,对于那些没有接触学习过编程语言或者多开发语言略懂的用户而言,Python语言绝对是最好的选择之一,并建议初学的程序员先从Python开始学习编程。

  1. import Queue, threading, sys
  2. from threading import Thread
  3. import time,urllib
  4. # working thread
  5. class Worker(Thread):
  6. def __init__( self, workQueue, resultQueue, , **kwds):
  7. Thread.__init__( self, **kwds )
  8. self.id = Worker.worker_count
  9. Worker.worker_count += 1
  10. self.setDaemon( True )
  11. self.workQueue = workQueue
  12. self.resultQueue = resultQueue
  13. self.timeout = timeout
  14. self.start( )
  15. def run( self ):
  16. ''' the get-some-work, do-some-work main loop of worker threads '''
  17. while True:
  18. try:
  19. callable, args, kwds = self.workQueue.get(timeout=self.timeout)
  20. res = callable(*args, **kwds)
  21. print "worker[%2d]: %s" % (self.id, str(res) )
  22. self.resultQueue.put( res )
  23. except Queue.Empty:
  24. break
  25. except :
  26. print 'worker[%2d]' % self.id, sys.exc_info()[:2]
  27. class WorkerManager:
  28. def __init__( self, , ):
  29. self.workQueue = Queue.Queue()
  30. self.resultQueue = Queue.Queue()
  31. self.workers = []
  32. self.timeout = timeout
  33. self._recruitThreads( num_of_workers )
  34. def _recruitThreads( self, num_of_workers ):
  35. for i in range( num_of_workers ):
  36. worker = Worker( self.workQueue, self.resultQueue, self.timeout )
  37. self.workers.append(worker)
  38. def wait_for_complete( self):
  39. # ...then, wait for each of them to terminate:
  40. while len(self.workers):
  41. worker = self.workers.pop()
  42. worker.join( )
  43. if worker.isAlive() and not self.workQueue.empty():
  44. self.workers.append( worker )
  45. print "All jobs are are completed."
  46. def add_job( self, callable, *args, **kwds ):
  47. self.workQueue.put( (callable, args, kwds) )
  48. def get_result( self, *args, **kwds ):
  49. return self.resultQueue.get( *args, **kwds )

Worker类是一个Python线程池,不断地从workQueue队列中获取需要执行的任务,执行之,并将结果写入到resultQueue中。这里的workQueue和resultQueue都是现成安全的,其内部对各个线程的操作做了互斥。当从workQueue中获取任务超时,则线程结束。

WorkerManager负责初始化Python线程池,提供将任务加入队列和获取结果的接口,并能等待所有任务完成。一个典型的测试例子如下,它用10个线程去下载一个固定页面的内容,实际应用时应该是执行不同的任务。

  1. def test_job(id, .001 ):
  2. try:
  3. urllib.urlopen('[url]https://www.gmail.com/[/url]').read()
  4. except:
  5. print '[%4d]' % id, sys.exc_info()[:2]
  6. return id
  7. def test():
  8. import socket
  9. socket.setdefaulttimeout(10)
  10. print 'start testing'
  11. wm = WorkerManager(10)
  12. for i in range(500):
  13. wm.add_job( test_job, i, i*0.001 )
  14. wm.wait_for_complete()
  15. print 'end testing'

对Python线程池的更多相关文章

  1. 自定义高级版python线程池

    基于简单版创建类对象过多,现自定义高级版python线程池,代码如下 #高级线程池 import queue import threading import time StopEvent = obje ...

  2. Python 线程池(小节)

    Python 线程池(小节) from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import os,time, ...

  3. python线程池ThreadPoolExecutor(上)(38)

    在前面的文章中我们已经介绍了很多关于python线程相关的知识点,比如 线程互斥锁Lock / 线程事件Event / 线程条件变量Condition 等等,而今天给大家讲解的是 线程池ThreadP ...

  4. python线程池及其原理和使用

    python线程池及其原理和使用 2019-05-29 17:05:20 whatday 阅读数 576 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很 ...

  5. python线程池示例

    使用with方式创建线程池,任务执行完毕之后,会自动关闭资源 , 否则就需要手动关闭线程池资源  import threading, time from concurrent.futures impo ...

  6. Python线程池与进程池

    Python线程池与进程池 前言 前面我们已经将线程并发编程与进程并行编程全部摸了个透,其实我第一次学习他们的时候感觉非常困难甚至是吃力.因为概念实在是太多了,各种锁,数据共享同步,各种方法等等让人十 ...

  7. python线程池实现

    python 的线程池主要有threadpool,不过它并不是内置的库,每次使用都需要安装,而且使用起来也不是那么好用,所以自己写了一个线程池实现,每次需要使用直接import即可.其中还可以根据传入 ...

  8. 《转》python线程池

    线程池的概念是什么? 在IBM文档库中这样的一段描写:“在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是 如此,虚拟机将试图跟踪每一个对象 ...

  9. 一个简单的python线程池框架

    初学python,实现了一个简单的线程池框架,线程池中除Wokers(工作线程)外,还单独创建了一个日志线程,用于日志的输出.线程间采用Queue方式进行通信. 代码如下:(不足之处,还请高手指正) ...

随机推荐

  1. 18-spring学习-利用Annotation配置AOP

    之前是通过配置完成aop操作,如果自己写的话,太麻烦了,可以使用基于annotation的配置完成. 第一步:打开AOP的annotation支持 加上一句话: <context:annotat ...

  2. linux 下处理大文件

    .head tail more .先把大文件进行分割 split split 参数: -a, --suffix-length=N 指定输出文件名的后缀,默认为2个 -b, --bytes=SIZE 指 ...

  3. Flume入门:安装、部署

    一.什么是Flume? flume 作为 cloudera 开发的实时日志收集系统,受到了业界的认可与广泛应用.Flume 初始的发行版本目前被统称为 Flume OG(original genera ...

  4. Think in Java(二):初始化与清理

    1. 区分重载方法: 參数顺序的不同能够区分两个方法,只是,普通情况下千万别这么做.由于这会使代码难以维护不能通过返回值类型来区分重载方法:由于假设我直接调用f(), 此时java不知道应该调用那一个 ...

  5. C/S和B/S 赞美创新,好酸啊。

    似乎是一个很古老的话题啊...翻出来炒冷饭也是很有趣的. 昨天聊iDempiere时说到了Client这个词,我和人家说我依然会条件反射般想到了C/S,从而又SB般感慨了一番世风日下,人心不古.... ...

  6. Provisional headers are shown(一)

    谷歌浏览器调试的时候,这个警告经常出现.但是每次产生的原因可能都是不一样的. 这篇文档记录我遇到的其中一次. 现象:一个并发的错误信息: CAUTION:request is not finished ...

  7. windows上通过secureCRT和putty创建密钥登录

    前面介绍了linux的ssh远程登录协议和ssh无password登录方式.这里在windows下通过secureCRT和putty登录linux来看一下详细的密钥创建,配置和登录.也算做个备忘录吧. ...

  8. C# “预先生成事件命令行”和“后期生成事件命令行”

    概述 Visual studio 项目允许在项目属性生成事件一栏中指定预先生成和后期生成事件来实现项目生成与部署的自动化. 实例1: 我自己写了一个调试工具,该工具处于一边开发一边使用过程中.实际工作 ...

  9. dango models and database ---- relation ship

    一.django自带的ORM中可以定义表与表之间的对应关系.现比较一下各个不同关系之间数据库端的实现 1.ForeignKey(ManyToOne)关系 from django.db import m ...

  10. 【Android】16.0 第16章 自定义服务和系统服务—本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-03-01 一.简介 本章主要演示Started Service.带Intent过滤器的Started Service.IntentSe ...