#coding:utf-8
import time
import os
import multiprocessing
def work(count):
print(count,',进程id:',os.getpid())
time.sleep(5)
if __name__ == '__main__':
pool = multiprocessing.Pool(5) #创建了5个进程
for i in range(20):
pool.apply_async(func=work,args=(i,))
time.sleep(20)
0 ,进程id: 8900
1 ,进程id: 15076
2 ,进程id: 11272
3 ,进程id: 17004
4 ,进程id: 15444
5 ,进程id: 15076
6 ,进程id: 8900
7 ,进程id: 11272
8 ,进程id: 17004
9 ,进程id: 15444
10 ,进程id: 15076
11 ,进程id: 8900
12 ,进程id: 11272
13 ,进程id: 17004
14 ,进程id: 15444
15 ,进程id: 8900
16 ,进程id: 15076
17 ,进程id: 17004
18 ,进程id: 11272
19 ,进程id: 15444
运行结果,可以看出:
1.进程id 是重复利用的,说明所有的进程是创建好的,放在一个Pool中。
2.因为Pool中一开始创建了5个进程,所以可以看到每次输出,都以5个,5个一起输出,因为Pool的最大能力是5。可以看到进程id 不是按照递增的顺序进行的,因为Pool 创建进程是异步的。
3.可以看到在主进程中有这一行代码:time.sleep(20),如果没有加这行代码,就看不到任何输出,为什么会这样呢?因为,在我们进程池还没有创建成功时,主进程已经运行完了。
4.如果不采用 time.sleep(20) 这种延时操作的话,也可以在后面加入 pool.close() pool.join() 来阻塞,这样也会等到进程池全部创建完毕。代码如下:
#coding:utf-8
import time
import os
import multiprocessing
def work(count):
print(count,',进程id:',os.getpid())
time.sleep(5)
if __name__ == '__main__':
pool = multiprocessing.Pool(5) #创建了5个进程
for i in range(20):
pool.apply_async(func=work,args=(i,))
pool.close()
pool.join()
获取进程的返回值:
#coding:utf-8
import time
import os
import multiprocessing
def work(count):
print(count,',进程id:',os.getpid())
time.sleep(5)
return 'result is %d,pid is %d' % (count,os.getpid())
if __name__ == '__main__':
pool = multiprocessing.Pool(5) #创建了5个进程
results=[]
for i in range(20):
result=pool.apply_async(func=work,args=(i,))
results.append(result)
for res in results:
print(res.get()) # 通过这种方式,也就不需要后续调用 pool.close() 和 pool.join()
# pool.close()
# pool.join()
进程锁 :
#coding:utf-8
import time
import os
import multiprocessing
def work(count,lock):
lock.acquire()
print(count,',进程id:',os.getpid())
time.sleep(5)
lock.release()
return 'result is %d,pid is %d' % (count,os.getpid())
if __name__ == '__main__':
pool = multiprocessing.Pool(5) #创建了5个进程
manager = multiprocessing.Manager()
lock=manager.Lock()
#results=[]
for i in range(20):
result=pool.apply_async(func=work,args=(i,lock))
#results.append(result)
# for res in results:
# print(res.get()) # 通过这种方式,也就不需要后续调用 pool.close() 和 pool.join()
pool.close()
pool.join()