进程池与进程锁

简介

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
# coding:utf-8

import multiprocessing , os, time

def work(count,lock):
lock.acquire()
print(count,os.getpid())
time.sleep(5)
lock.release()
return 'result is %s, pid is %s' %(count,os.getpid())

if __name__=='__main__':
start = time.time()
pool = multiprocessing.Pool(5) # 设置进程数为5的进程池
manger = multiprocessing.Manager()
lock = manger.Lock()

# results = []
for i in range(5):
result = pool.apply_async(func= work,args=(i,lock)) # args 参数是元组 ,apply是阻塞式的。apply_async是异步非阻塞式的,
# 大家一起抢,可能紫禁城没运行完主进程都结束了,所以要配锁。而方法内都有锁,又导致了抢到了工作别人就只能等着,实际是还是一个一个来。
# apply_async 在进程池中运行起来,主进程就不会等了直接往后走了,意思是主进程循环完 for i in range(5),
# 具体的result 得出交给了子进程,主进程循环完就往下读了。
# results.append(result)
# for res in results:
# print(res.get())

pool.close() # 用close和join 保证pool中的子进程全部执行完毕才退出
pool.join() # 不加,close和join,进程池一直打开。可以延长主进程停顿时间保证子进程执行完。
# 当进程池close的时候并未关闭进程池,只是会把状态改为不可再插入元素的状态,完全关闭进程池使用
# join 阻塞,保证进程池中子进程全部执行完毕,才撤销阻塞。

master_consume_time = time.time()-start
print(master_consume_time)