本文实例分析了Python自定义进程池。分享给大家供大家参考,具体如下:
代码说明一切:
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
|
#encoding=utf-8 #author: walker #date: 2014-05-21 #function: 自定义进程池遍历目录下文件 from multiprocessing import Process, Queue, Lock import time, os #消费者 class Consumer(Process): def __init__( self , queue, ioLock): super (Consumer, self ).__init__() self .queue = queue self .ioLock = ioLock def run( self ): while True : task = self .queue.get() #队列中无任务时,会阻塞进程 if isinstance (task, str ) and task = = 'quit' : break ; time.sleep( 1 ) #假定任务处理需要1秒钟 self .ioLock.acquire() print ( str (os.getpid()) + ' ' + task) self .ioLock.release() self .ioLock.acquire() print 'Bye-bye' self .ioLock.release() #生产者 def Producer(): queue = Queue() #这个队列是进程/线程安全的 ioLock = Lock() subNum = 4 #子进程数量 workers = build_worker_pool(queue, ioLock, subNum) start_time = time.time() for parent, dirnames, filenames in os.walk(r 'D:\test' ): for filename in filenames: queue.put(filename) ioLock.acquire() print ( 'qsize:' + str (queue.qsize())) ioLock.release() while queue.qsize() > subNum * 10 : #控制队列中任务数量 time.sleep( 1 ) for worker in workers: queue.put( 'quit' ) for worker in workers: worker.join() ioLock.acquire() print ( 'Done! Time taken: {}' . format (time.time() - start_time)) ioLock.release() #创建进程池 def build_worker_pool(queue, ioLock, size): workers = [] for _ in range (size): worker = Consumer(queue, ioLock) worker.start() workers.append(worker) return workers if __name__ = = '__main__' : Producer() |
ps:
1
2
3
|
self .ioLock.acquire() ... self .ioLock.release() |
可用:
1
2
|
with self .ioLock: ... |
替代。
再来一个好玩的例子:
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
|
#encoding=utf-8 #author: walker #date: 2016-01-06 #function: 一个多进程的好玩例子 import os, sys, time from multiprocessing import Pool cur_dir_fullpath = os.path.dirname(os.path.abspath(__file__)) g_List = [ 'a' ] #修改全局变量g_List def ModifyDict_1(): global g_List g_List.append( 'b' ) #修改全局变量g_List def ModifyDict_2(): global g_List g_List.append( 'c' ) #处理一个 def ProcOne(num): print ( 'ProcOne ' + str (num) + ', g_List:' + repr (g_List)) #处理所有 def ProcAll(): pool = Pool(processes = 4 ) for i in range ( 1 , 20 ): #ProcOne(i) #pool.apply(ProcOne, (i,)) pool.apply_async(ProcOne, (i,)) pool.close() pool.join() ModifyDict_1() #修改全局变量g_List if __name__ = = '__main__' : ModifyDict_2() #修改全局变量g_List print ( 'In main g_List :' + repr (g_List)) ProcAll() |
Windows7 下运行的结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
λ python3 demo.py In main g_List :[ 'a' , 'b' , 'c' ] ProcOne 1 , g_List:[ 'a' , 'b' ] ProcOne 2 , g_List:[ 'a' , 'b' ] ProcOne 3 , g_List:[ 'a' , 'b' ] ProcOne 4 , g_List:[ 'a' , 'b' ] ProcOne 5 , g_List:[ 'a' , 'b' ] ProcOne 6 , g_List:[ 'a' , 'b' ] ProcOne 7 , g_List:[ 'a' , 'b' ] ProcOne 8 , g_List:[ 'a' , 'b' ] ProcOne 9 , g_List:[ 'a' , 'b' ] ProcOne 10 , g_List:[ 'a' , 'b' ] ProcOne 11 , g_List:[ 'a' , 'b' ] ProcOne 12 , g_List:[ 'a' , 'b' ] ProcOne 13 , g_List:[ 'a' , 'b' ] ProcOne 14 , g_List:[ 'a' , 'b' ] ProcOne 15 , g_List:[ 'a' , 'b' ] ProcOne 16 , g_List:[ 'a' , 'b' ] ProcOne 17 , g_List:[ 'a' , 'b' ] ProcOne 18 , g_List:[ 'a' , 'b' ] ProcOne 19 , g_List:[ 'a' , 'b' ] |
Ubuntu 14.04下运行的结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
In main g_List :[ 'a' , 'b' , 'c' ] ProcOne 1 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 2 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 3 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 5 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 4 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 8 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 9 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 7 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 11 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 6 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 12 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 13 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 10 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 14 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 15 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 16 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 17 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 18 , g_List:[ 'a' , 'b' , 'c' ] ProcOne 19 , g_List:[ 'a' , 'b' , 'c' ] |
可以看见Windows7下第二次修改没有成功,而Ubuntu下修改成功了。据uliweb作者limodou讲,原因是Windows下是充重启实现的子进程;Linux下是fork实现的。
希望本文所述对大家Python程序设计有所帮助。