本文对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'

最新文章

  1. 统一资源定位符URL类
  2. Hadoop CDH5 集群管理
  3. Android Activity生命周期 onSaveInstanceState和onRestoreInstanceState
  4. [MySQL优化案例]系列 — slave延迟很大优化方法
  5. 游戏里的动态阴影-ShadowMap实现原理
  6. 在android系统上写C语言程序--开机启动该程序不进入安卓系统
  7. Sharing The Application Tier File System in Oracle E-Business Suite Release 12.2
  8. ROS_Kinetic_15 ROS使用Qt
  9. MNIST手写识别
  10. 3D GIS 应用开发 —— 基于 Mapbox GL 的实践总结
  11. css经常使用的六种文本样式
  12. QQ空间、新浪微博、腾讯微博等一键分享API链接代码
  13. oracle sql 获取本季度所有月份,上季度所有月份
  14. table标签总结
  15. SQL Script for select data from ebs and make a csv file to FTP
  16. js实现UTC时间转为北京时间,时间戳转为时间
  17. 【zookeeper】 zookeeper 集群搭建
  18. php模拟http请求
  19. ubuntu下搭建android开发环境之超顺畅模拟器
  20. c++ new(不断跟新)

热门文章

  1. WPF显示经常使用的几个显示文字控件TextBox, TextBlock, Lable
  2. Java中被你忽视的四种引用(转)
  3. VC、OpenGL、ArcGIS Engine开发的二维三维结合的GIS系统
  4. 如何用原生js或jquery设置select的值
  5. android 实现全屏代码
  6. MySQL UUID函数的详解(转)
  7. MFC显示GIF动画图片
  8. powerdesigner 画PDM
  9. Lintcode---将二叉树拆成链表
  10. PHP垃圾回收机制引用计数器概念