对Python线程池使用方法和说明(转载)
来源:互联网 发布:非农数据时间 编辑:程序博客网 时间:2024/06/02 01:28
转自 http://developer.51cto.com/art/201002/185290.htm
下面给大家总结一下自己总结的对Python线程池经验之谈,对于那些没有接触学习过编程语言或者多开发语言略懂的用户而言,Python语言绝对是最好的选择之一,并建议初学的程序员先从Python开始学习编程。
- import Queue, threading, sys
- from threading import Thread
- import time,urllib
- # working thread
- class Worker(Thread):
- worker_count = 0
- def __init__( self, workQueue, resultQueue, timeout = 0, **kwds):
- Thread.__init__( self, **kwds )
- self.id = Worker.worker_count
- Worker.worker_count += 1
- self.setDaemon( True )
- self.workQueue = workQueue
- self.resultQueue = resultQueue
- self.timeout = timeout
- self.start( )
- def run( self ):
- ''' the get-some-work, do-some-work main loop of worker threads '''
- while True:
- try:
- callable, args, kwds = self.workQueue.get(timeout=self.timeout)
- res = callable(*args, **kwds)
- print "worker[%2d]: %s" % (self.id, str(res) )
- self.resultQueue.put( res )
- except Queue.Empty:
- break
- except :
- print 'worker[%2d]' % self.id, sys.exc_info()[:2]
- class WorkerManager:
- def __init__( self, num_of_workers=10, timeout = 1):
- self.workQueue = Queue.Queue()
- self.resultQueue = Queue.Queue()
- self.workers = []
- self.timeout = timeout
- self._recruitThreads( num_of_workers )
- def _recruitThreads( self, num_of_workers ):
- for i in range( num_of_workers ):
- worker = Worker( self.workQueue, self.resultQueue, self.timeout )
- self.workers.append(worker)
- def wait_for_complete( self):
- # ...then, wait for each of them to terminate:
- while len(self.workers):
- worker = self.workers.pop()
- worker.join( )
- if worker.isAlive() and not self.workQueue.empty():
- self.workers.append( worker )
- print "All jobs are are completed."
- def add_job( self, callable, *args, **kwds ):
- self.workQueue.put( (callable, args, kwds) )
- def get_result( self, *args, **kwds ):
- return self.resultQueue.get( *args, **kwds )
Worker类是一个Python线程池,不断地从workQueue队列中获取需要执行的任务,执行之,并将结果写入到resultQueue中。这里的workQueue和resultQueue都是现成安全的,其内部对各个线程的操作做了互斥。当从workQueue中获取任务超时,则线程结束。
WorkerManager负责初始化Python线程池,提供将任务加入队列和获取结果的接口,并能等待所有任务完成。一个典型的测试例子如下,它用10个线程去下载一个固定页面的内容,实际应用时应该是执行不同的任务。
- def test_job(id, sleep = 0.001 ):
- try:
- urllib.urlopen('[url]https://www.gmail.com/[/url]').read()
- except:
- print '[%4d]' % id, sys.exc_info()[:2]
- return id
- def test():
- import socket
- socket.setdefaulttimeout(10)
- print 'start testing'
- wm = WorkerManager(10)
- for i in range(500):
- wm.add_job( test_job, i, i*0.001 )
- wm.wait_for_complete()
- print 'end testing'
- 对Python线程池使用方法和说明(转载)
- 转载:python encode和decode函数说明
- CPUFREQ驱动使用方法说明(转载)
- PreTranslateMessage作用和使用方法(转载)
- XML和XPath使用方法备忘(转载)
- 线程池(转载)
- android线程池的使用方法和原理
- python 进程,线程的使用方法
- 我对python线程池的理解
- FileOutputStream和FileInputStream使用方法说明
- addKeyListener的使用方法和说明
- FileOutputStream和FileInputStream使用方法说明
- Fragment 简单说明和使用方法
- 对进程、线程、应用程序域的理解 (转载)
- 虚拟机使用方法(转载)
- (转载)wget使用方法
- Bibtex使用方法(转载)
- BibTeX使用方法(转载)
- Linux系统调用--getrlimit()与setrlimit()函数详解
- reinterpret_cast
- 千万级别的数据存储
- 下拉列表(引入TableViewWithBlock包)
- select into from 和 into from select
- 对Python线程池使用方法和说明(转载)
- sata硬盘通过usb转sata芯片挂载在hub芯片上,其他的usb键盘和鼠标等挂载在hub下都能识别,只有硬盘不能识别
- C++中需要注意的细节
- Emgu CV库:.net平台下对openCV图像处理库的封装
- Python程序的性能分析指南
- inotify -- Linux 2.6 内核中的文件系统变化通知机制
- Linux中grep命令的用法
- A. Cookies
- java 字体颜色转换工具类 ColorUtil