python 线程池学习

#!/usr/bin/python

import Queue, threading, sys

from threading import Thread

import time,urllib

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 )

if __name__ == ‘__main__‘:

def test_job(id, sleep = 0.001 ):

try:

a=urllib.urlopen(‘http://www.baidu.com/‘).read()

except:

print ‘[%4d]‘ % id, sys.exc_info()[:2]

return id

import socket

socket.setdefaulttimeout(10)

print ‘start testing‘

wm = WorkerManager(2)

for i in range(2):

wm.add_job( test_job, i, i*0.001 )

print wm.get_result( i, i*0.001 )

wm.wait_for_complete()

print ‘end testing‘

个人理解

1.首先实例化WorkerManager(2),在实例化WorkerManager类的时候,首先创建2个队列一个为执行队列,一个为结果队列

2.执行_recruitThreads,循环2次,在这函数中实例化Worker类,并把刚才创建的2个队列传过去,并且往workers这个列表里插入元祖,workers这个列表使用来判断是否队列中的任务都执行完成的
Worker类继承了Thread,初始化一下Thread,调用Thread模块中的start方法,其中start方法中有run这个方法,这里面重写了run方法,self.start( )也就是执行Worker类中的run方法

3.因为下面在执行任务的时候准备往队列里掺入的数据为wm.add_job( test_job, i, i*0.001 )这个格式---所以去get任务执行队列,看看队列是不是空,如果不是空执行res = callable(*args, **kwds),并且把数据写入到结果队列中,但是由于第一次初始化,队列中还没有任务会卡在这

4.执行wm.add_job( test_job, i, i*0.001 ),把2个任务放到刚才创建好的队列中,这2个任务是多线程执行的

5.wm.wait_for_complete()第一步先从列表中逐一删除数据,删除完后等待这个线程是否退出,这里注意join和isalive的区别,join不管是线程执行超时还是正常退出返回值都是none,而isalive是看线程是否还存活,如果线程还存活,并且任务队列不为空,还是要把之前从列表中删除的元祖添加回去,因为线程还没有执行完成,知道判断workers这个列表中没有数据了 整个程序才会推出

不过上面程序在判断线程是不是都执行完了的逻辑,我觉得有写问题

如果多个任务怎么办,如果想10个线程执行test1函数,10个任务执行test2函数怎么办,知道怎么了也就差不多明白怎么回事了

时间: 2024-10-09 21:14:14

python 线程池学习的相关文章

Java 线程池学习

Reference: <创建Java线程池>[1],<Java线程:新特征-线程池>[2], <Java线程池学习>[3],<线程池ThreadPoolExecutor使用简介>[4],<Java5中的线程池实例讲解>[5],<ThreadPoolExecutor使用和思考>[6] [1]中博主自己通过ThreadGroup实现一个线程池(挺方便理解的),使用的是jdk1.4版本,Jdk1.5版本以上提供了现成的线程池. [2]中介绍

我对python线程池的理解

#!/usr/bin/env pythonfrom Queue import Queuefrom threading import Threadimport randomimport time def person(i,q):    while True:  #这个人一直处与可以接活干的状态        q.get()        print "Thread",i,"do_job"        time.sleep(random.randint(1,5))#每

多线程及线程池学习心得

一.线程的应用与特点 多线程是程序员不可或缺的技术能力,多线程技术在各个方面都有应用,特别在性能优化上更是起到至关重要的作用.但是,如果多线程写得不好,往往会适得其反,特别是高并发时会造成阻塞.超时等现象.多线程具有以下特点:1.独立性,拥有自己独立的资源,拥有自己私有的地址空间:2.动态性,进程具有自己的生命周期和各种不同的状态:3.并发性,多个进程可以在单个处理器上并发执行,不会相互影响,并行是指同一时刻有多条指令在多个处理器上同时执行.线程是进程的组成部分,一个进程可以拥有多个线程,一个线

Android多线程编程之线程池学习篇(一)

Android多线程编程之线程池学习篇(一) 一.前言 Android应用开发中多线程编程应用比较广泛,而应用比较多的是ThreadPoolExecutor,AsyncTask,IntentService,HandlerThread,AsyncTaskLoader等,为了更详细的分析每一种实现方式,将单独成篇分析.后续篇章中可能涉及到线程池的知识,特此本篇分析为何使用线程池,如何使用线程池以及线程池的使用原理. 二.Thread Pool基础 进程代表一个运行中的程序,一个运行中的Android

python线程池

线程池: 版本一: #!/usr/bin/env python # -*- coding:utf-8 -*- import Queue import threading class ThreadPool(object): def __init__(self, max_num=20): self.queue = Queue.Queue(max_num) for i in xrange(max_num): self.queue.put(threading.Thread) def get_thread

Python 线程池

python默认没有提供线程池的功能,所以要想使用线程池,就必要使用第三方的模块或者自定义线程 线程并不是越多越好,线程的上下文切换会影响到服务器的性能 线程池:一个容器,有最大数,取一个少一个,无线程时等待,线程执行完毕,交还线程 __author__ = 'alex' #coding:utf-8 import queue import threading import time class ThreadPool: def __init__(self,maxsize=5): self.maxs

一个简单的python线程池框架

初学python,实现了一个简单的线程池框架,线程池中除Wokers(工作线程)外,还单独创建了一个日志线程,用于日志的输出.线程间采用Queue方式进行通信. 代码如下: 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 __author__ = "pandaychen" 5 6 import Queue 7 import sys 8 import os 9 import threading 10 import time 11

线程池学习笔记

记录一下学习线程池的过程,代码用到的函数归结: pthread_mutex_lock pthread_mutex_unlock pthread_cond_wait pthread_cond_signal pthread_cond_broadcast pthread_create pthread_join 程序中还用到了链表, 还有一个知识点:任何类型的数据都可以是void类型, 但void类型在使用之前必须进行强制类型转换. /* *Author:Greens_Ren *Description:

小白成长之路:初识python(六) --python线程池

#!/usr/bin/env python# -*- coding:utf-8 -*-import threadingimport queueimport time"""对照着武老师的课程自己跟着做了一个线程池,主要的思路就是把要执行的任务放进队列中然后创建若干个线程不断地从队列中获取任务并执行相对比low B 版的线程池有很大改进,姑且叫low A版吧...""" Stop_Flag = object() class ThreadPool(ob