实现代码:
#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/
分享到:
相关推荐
一、线程池 1、为什么需要使用线程池 1.1 创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率。...比如:延时执行、定时循环执行的策略等,运用线程池都能进行很好的实现。 2、
在Python中,虽然标准库`threading`提供了线程的创建和管理,但没有内置的线程池实现。然而,Python社区中有许多第三方库实现了线程池功能,如`concurrent.futures`(Python 3.2及以上版本)和`multiprocessing....
本文将详细介绍Python线程池Threadpool的实现,涉及的概念、设计和编程方法,适合希望深入理解和使用Python线程池的开发者。 首先,让我们了解线程池中的核心组件。线程池Threadpool实现篇中会涉及到以下术语和概念...
### 浅谈Python线程池ThreadPool之实现 在并发编程领域,线程池技术是一种非常高效的方法,可以显著提升程序的执行效率。Python中的`threadpool`库为开发者提供了便捷的方式来管理和利用线程池。本文将详细介绍...
在Python2.7中,虽然`concurrent.futures`模块没有被引入,但开发者可以通过`threading`模块自己实现线程池。描述中提到的"由7个类组成的小线程池"可能包括以下组件: 1. **ThreadPool类**:这是线程池的核心,负责...
总的来说,Python线程池通过预先创建一定数量的线程,实现了对线程资源的有效管理和复用,降低了系统的开销,提高了程序运行效率。在实际开发中,应根据任务的性质和系统资源选择合适的方式来使用线程池,以达到最佳...
综上所述,Python语言在实现线程池方面的应用不仅必要而且高效。它能够极大地减少线程维护的开销,提升程序处理多并发任务的能力,从而在处理大量维护对象时展现出卓越的性能。然而,在构建和应用线程池时,也应当...
线程池是Python中实现并发编程的重要工具,它通过复用线程资源,减少了线程创建和销毁的开销,提高了程序的执行效率。通过concurrent.futures模块,我们可以方便地创建和管理线程池,实现异步任务的提交和结果的获取...
通过上述分析可以看出,Python线程池的实现主要是基于线程和队列的概念,通过合理的线程管理和任务调度来提高程序的执行效率和响应速度。理解这些核心概念和技术细节对于高效利用Python多线程编程至关重要。
Python线程池模块`ThreadPoolExecutor`是Python标准库`concurrent.futures`的一部分,它提供了一种方便且高效的方式来管理线程,以便并发地执行多个任务。线程池的概念允许我们预先创建一组线程,然后根据需要分配...
Django异步任务线程池实现原理主要涉及以下几个核心知识点: 1. 异步任务执行原理: 当Django应用在处理耗时的任务时,通常会阻塞主线程,导致用户在等待处理结果时无法进行其他操作。为了解决这个问题,Django采用...
本文实例讲述了Python自定义线程池实现方法。分享给大家供大家参考,具体如下: 关于python的多线程,由与GIL的存在被广大群主所诟病,说python的多线程不是真正的多线程。但多线程处理IO密集的任务效率还是可以杠杠...
原理:建立一个任务队列,然多个线程都从这个任务队列中取出任务然后执行,当然任务队列要加锁,详细请看代码 import threading import time import signal import os class task_info(object): ...
Python线程池(ThreadPoolExecutor)是Python标准库`concurrent.futures`的一部分,它提供了一种方便的方式来管理和控制并发执行的任务。线程池允许我们预先创建一定数量的线程,然后将任务提交到这个线程池中,由...
python3标准库里自带线程池ThreadPoolExecutor和进程池ProcessPoolExecutor。 如果你用的是python2,那可以下载一个模块,叫threadpool,这是线程池。对于进程池可以使用python自带的multiprocessing.Pool。 当然也...