Python 进程池与进程锁

#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()

posted @ 2022-12-16 20:59  repinkply  阅读(84)  评论(0)    收藏  举报