python之multiprocessing创建进程 (2)

创建Pool池时,如果不指定进程最大数量,默认创建的进程数为系统的内核数量.

Pool对象分析 class Pool(object): def __init__(self, processes=None, initializer=None, initargs=(), maxtasksperchild=None, context=None): pass # 初始化参数 processes:进程池的大小,默认cpu内核的数量 initializer:创建进程执行的目标函数,其会按照进程池的大小创建相应个数的进程; initargs:目标函数的参数 context:代码的上下文 # 方法 apply():使用阻塞方式调用func; apply_async():使用非阻塞方式条用func; close():关闭Pool,使其不再接受新的任务; terminate():不管任务是否完成,立即终止; join():主进程阻塞,等待子进程的退出,必须在close()后面使用; map(self, func, iterable, chunksize=None):多进程执行一个函数,传入不同的参数; starmap(self, func, iterable, chunksize=None):和map类似,但iterable参数可解压缩; starmap_async(self, func, iterable, chunksize=None, callback=None,error_callback=None):使用异步的方式的starmap,callback为返回后的处理函数 map_async(self, func, iterable, chunksize=None, callback=None,error_callback=None):异步方式的map

实例

from multiprocessing import Pool import os def test(n): time.sleep(1) print('this is process {}'.format(os.getpid())) return n def test1(n, m): print(n, m) print('this is process {}'.format(os.getpid())) def back_func(values): # 多进程执行完毕会返回所有的结果的列表 print(values) def back_func_err(values): # 多进程执行完毕会返回所有错误的列表 print(values) def get_pool(n=5): p = Pool(n) # p.map(test, (i for i in range(10))) # 阻塞式多进程执行 # p.starmap(test1, zip([1,2,3],[3,4,5])) # 阻塞式多进程执行多参数函数 # 异步多进程执行函数 p.map_async(test, (i for i in range(5)), callback=back_func, error_callback=back_func_err) # 异步多进程执行多参数函数 p.starmap_async(test1, zip([1,2,3],[3,4,5]), callback=back_func, error_callback=back_func_err) print('-----') p.close() p.join() if __name__ == '__main__': get_pool() print('ths process is ended') 进程锁

进程虽然不像线程那样共享内存的数据,而是每个进程有单独的内存,但多进程也是共享文件系统的,即硬盘系统;当多进程同时写入文件操作时,可能造成数据的破坏,因此进程也存在同步锁。

from multiprocessing import Pool, Lock muex = Lock() def test(): if muex.acquire(): f = open('./test_pro.txt', 'r+', encoding='utf-8') x = f.read() if not x: f.write('0') else: f.seek(0) f.write(str(int(x)+1)) f.close() muex.release() if __name__ == '__main__': p = Pool(5) for i in range(10): p.apply_async(test) p.close() p.join() with open('./test_pro.txt', 'r+', encoding='utf-8') as f: print(f.read())

进程锁可以保证文件系统的安全,但是它使得并行变成了串行,效率下降了,也可能造成死锁问题,一般避免用锁机制。

参考

https://docs.python.org/

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwwxz.html