原理:建立一个任务队列,然多个线程都从这个任务队列中取出任务然后执行,当然任务队列要加锁,详细请看代码
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
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
|