温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎样理解Python线程池

发布时间:2021-10-27 19:10:38 来源:亿速云 阅读:122 作者:柒染 栏目:编程语言

本篇文章给大家分享的是有关怎样理解Python线程池,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

总结一下自己总结的对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线程池,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI