本文实例讲述了python实现线程池的方法。分享给大家供大家参考。具体如下:
原理:建立一个任务队列,然多个线程都从这个任务队列中取出任务然后执行,当然任务队列要加锁,详细请看代码
文件名:thrd_pool.py 系统环境:ubuntu linux & python2.6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
import threading
import time
import signal
import os
class task_info( object ):
def __init__( self ):
self .func = None
self .parm0 = None
self .parm1 = None
self .parm2 = None
class task_list( object ):
def __init__( self ):
self .tl = []
self .mutex = threading.Lock()
self .sem = threading.Semaphore( 0 )
def append( self , ti):
self .mutex.acquire()
self .tl.append(ti)
self .mutex.release()
self .sem.release()
def fetch( self ):
self .sem.acquire()
self .mutex.acquire()
ti = self .tl.pop( 0 )
self .mutex.release()
return ti
class thrd(threading.Thread):
def __init__( self , tl):
threading.Thread.__init__( self )
self .tl = tl
def run( self ):
while True :
tsk = self .tl.fetch()
tsk.func(tsk.parm0, tsk.parm1, tsk.parm2)
class thrd_pool( object ):
def __init__( self , thd_count, tl):
self .thds = []
for i in range (thd_count):
self .thds.append(thrd(tl))
def run( self ):
for thd in self .thds:
thd.start()
def func(parm0 = None , parm1 = None , parm2 = None ):
print 'count:%s, thrd_name:%s' % ( str (parm0), threading.currentThread().getName())
def cleanup(signo, stkframe):
print ( 'Oops! Got signal %s' , signo)
os._exit( 0 )
if __name__ = = '__main__' :
signal.signal(signal.SIGINT, cleanup)
signal.signal(signal.SIGQUIT, cleanup)
signal.signal(signal.SIGTERM, cleanup)
tl = task_list()
tp = thrd_pool( 6 , tl)
tp.run()
count = 0
while True :
ti = task_info()
ti.parm0 = count
ti.func = func
tl.append(ti)
count + = 1
time.sleep( 2 )
pass
|
执行方式:python thrd_pool.py
执行结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
count: 0 , thrd_name:Thread - 1
count: 1 , thrd_name:Thread - 2
count: 2 , thrd_name:Thread - 3
count: 3 , thrd_name:Thread - 4
count: 4 , thrd_name:Thread - 5
count: 5 , thrd_name:Thread - 1
count: 6 , thrd_name:Thread - 6
count: 7 , thrd_name:Thread - 2
count: 8 , thrd_name:Thread - 3
count: 9 , thrd_name:Thread - 4
count: 10 , thrd_name:Thread - 5
count: 11 , thrd_name:Thread - 1
count: 12 , thrd_name:Thread - 6
count: 13 , thrd_name:Thread - 2
count: 14 , thrd_name:Thread - 3
( 'Oops! Got signal %s' , 15 )
|
希望本文所述对大家的Python程序设计有所帮助。