原理:建立一个任务队列,然多个线程都从这个任务队列中取出任务然后执行,当然任务队列要加锁,详细请看代码
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 |