`
biansutao
  • 浏览: 53636 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Python的线程池实现

阅读更多

实现代码:

#coding:utf-8
import Queue
import threading
import sys
import time
import urllib

#替我们工作的线程池中的线程
class MyThread(threading.Thread):
 def __init__(self, workQueue, resultQueue,timeout=30, **kwargs):
  threading.Thread.__init__(self, kwargs=kwargs)
  #线程在结束前等待任务队列多长时间
  self.timeout = timeout
  self.setDaemon(True)
  self.workQueue = workQueue
  self.resultQueue = resultQueue
  self.start()

 def run(self):
  while True:
   try:
    #从工作队列中获取一个任务
    callable, args, kwargs = self.workQueue.get(timeout=self.timeout)
    #我们要执行的任务
    res = callable(args, kwargs)
    #报任务返回的结果放在结果队列中
    self.resultQueue.put(res+" | "+self.getName())    
   except Queue.Empty: #任务队列空的时候结束此线程
    break
   except :
    print sys.exc_info()
    raise
    
class ThreadPool:
 def __init__( self, num_of_threads=10):
  self.workQueue = Queue.Queue()
  self.resultQueue = Queue.Queue()
  self.threads = []
  self.__createThreadPool( num_of_threads )

 def __createThreadPool( self, num_of_threads ):
  for i in range( num_of_threads ):
   thread = MyThread( self.workQueue, self.resultQueue )
   self.threads.append(thread)

 def wait_for_complete(self):
  #等待所有线程完成。
  while len(self.threads):
   thread = self.threads.pop()
   #等待线程结束
   if thread.isAlive():#判断线程是否还存活来决定是否调用join
    thread.join()
    
 def add_job( self, callable, *args, **kwargs ):
  self.workQueue.put( (callable,args,kwargs) )

def test_job(id, sleep = 0.001 ):
 html = ""
 try:
  time.sleep(1)
  conn = urllib.urlopen('http://www.google.com/')
  html = conn.read(20)
 except:
  print  sys.exc_info()
 return  html

def test():
 print 'start testing'
 tp = ThreadPool(10)
 for i in range(50):
  time.sleep(0.2)
  tp.add_job( test_job, i, i*0.001 )
 tp.wait_for_complete()
 #处理结果
 print 'result Queue\'s length == %d '% tp.resultQueue.qsize()
 while tp.resultQueue.qsize():
  print tp.resultQueue.get()
 print 'end testing'
if __name__ == '__main__':
 test()

 

参考资料:http://blog.daviesliu.net/2006/10/09/234822/

http://hi.baidu.com/flowsing/blog/item/76cccbfbe1b76e214f4aeab8.html

http://www.ibm.com/developerworks/cn/aix/library/au-threadingpython/

分享到:
评论

相关推荐

    Python 使用threading+Queue实现线程池示例

    一、线程池 1、为什么需要使用线程池 1.1 创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率。...比如:延时执行、定时循环执行的策略等,运用线程池都能进行很好的实现。 2、

    threadpool:简单的Python线程池实现(2009年SVN中的Chris Arndt)

    在Python中,虽然标准库`threading`提供了线程的创建和管理,但没有内置的线程池实现。然而,Python社区中有许多第三方库实现了线程池功能,如`concurrent.futures`(Python 3.2及以上版本)和`multiprocessing....

    python线程池threadpool实现篇

    本文将详细介绍Python线程池Threadpool的实现,涉及的概念、设计和编程方法,适合希望深入理解和使用Python线程池的开发者。 首先,让我们了解线程池中的核心组件。线程池Threadpool实现篇中会涉及到以下术语和概念...

    浅谈python 线程池threadpool之实现

    ### 浅谈Python线程池ThreadPool之实现 在并发编程领域,线程池技术是一种非常高效的方法,可以显著提升程序的执行效率。Python中的`threadpool`库为开发者提供了便捷的方式来管理和利用线程池。本文将详细介绍...

    Python实现的线程池

    在Python2.7中,虽然`concurrent.futures`模块没有被引入,但开发者可以通过`threading`模块自己实现线程池。描述中提到的"由7个类组成的小线程池"可能包括以下组件: 1. **ThreadPool类**:这是线程池的核心,负责...

    实例代码讲解Python 线程池

    总的来说,Python线程池通过预先创建一定数量的线程,实现了对线程资源的有效管理和复用,降低了系统的开销,提高了程序运行效率。在实际开发中,应根据任务的性质和系统资源选择合适的方式来使用线程池,以达到最佳...

    Python 应用之线程池.pdf

    综上所述,Python语言在实现线程池方面的应用不仅必要而且高效。它能够极大地减少线程维护的开销,提升程序处理多并发任务的能力,从而在处理大量维护对象时展现出卓越的性能。然而,在构建和应用线程池时,也应当...

    Python线程池:高效并发编程的实践指南

    线程池是Python中实现并发编程的重要工具,它通过复用线程资源,减少了线程创建和销毁的开销,提高了程序的执行效率。通过concurrent.futures模块,我们可以方便地创建和管理线程池,实现异步任务的提交和结果的获取...

    python实现线程池的方法

    通过上述分析可以看出,Python线程池的实现主要是基于线程和队列的概念,通过合理的线程管理和任务调度来提高程序的执行效率和响应速度。理解这些核心概念和技术细节对于高效利用Python多线程编程至关重要。

    Python线程池模块ThreadPoolExecutor用法分析

    Python线程池模块`ThreadPoolExecutor`是Python标准库`concurrent.futures`的一部分,它提供了一种方便且高效的方式来管理线程,以便并发地执行多个任务。线程池的概念允许我们预先创建一组线程,然后根据需要分配...

    Django异步任务线程池实现原理

    Django异步任务线程池实现原理主要涉及以下几个核心知识点: 1. 异步任务执行原理: 当Django应用在处理耗时的任务时,通常会阻塞主线程,导致用户在等待处理结果时无法进行其他操作。为了解决这个问题,Django采用...

    Python自定义线程池实现方法分析

    本文实例讲述了Python自定义线程池实现方法。分享给大家供大家参考,具体如下: 关于python的多线程,由与GIL的存在被广大群主所诟病,说python的多线程不是真正的多线程。但多线程处理IO密集的任务效率还是可以杠杠...

    Python实现线程池代码分享

    原理:建立一个任务队列,然多个线程都从这个任务队列中取出任务然后执行,当然任务队列要加锁,详细请看代码 import threading import time import signal import os class task_info(object): ...

    Python 线程池用法简单示例

    Python线程池(ThreadPoolExecutor)是Python标准库`concurrent.futures`的一部分,它提供了一种方便的方式来管理和控制并发执行的任务。线程池允许我们预先创建一定数量的线程,然后将任务提交到这个线程池中,由...

    用python实现的线程池实例代码

    python3标准库里自带线程池ThreadPoolExecutor和进程池ProcessPoolExecutor。 如果你用的是python2,那可以下载一个模块,叫threadpool,这是线程池。对于进程池可以使用python自带的multiprocessing.Pool。 当然也...

Global site tag (gtag.js) - Google Analytics