对Python线程池使用方法和说明(转载)

来源:互联网 发布:非农数据时间 编辑:程序博客网 时间:2024/06/02 01:28

转自 http://developer.51cto.com/art/201002/185290.htm

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

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

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

  1. def test_job(id, sleep = 0.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'
原创粉丝点击