三十一、Python--进程
一、multiprocessing 模块
multiprocessing 是python 的多进程管理包,和threading.Thread类似。直接从侧面用subprocesses 替换线程使用GIL的方式。由于这一点,multiprocessing 模块可以让程序员在给定的机器上充分利用cpu。
在multiprocessing中,通过创建Process 对象生成进程,然后调用它的start()方法。
进程中之间的数据需要各自持有一份,所以创建线程比较消耗内存。
有window中没有os.fork(),所以不支持直接使用process,需要添加__name__ = '__main__'
1 from multiprocessing import Process_ 2 3 def f(name): 4 print('hello',name) 5 6 if __name__ == '__main__': 7 p = Process(target=f,args=('bob',)) 8 p.start() 9 p.join()
二、进程间的数据共享
在使用并发设置的时候,最好尽量避免共享数据。尤其在使用多线程的时候。如果真的需要共享数据,multiprocessing 提供了两种方式
进程各自持有一份数据,默认不共享数据
1 from multiprocessing import Process 2 from multiprocessing import Manager 3 4 import time 5 6 li = [] 7 print('Father Process',id(li)) 8 9 def foo(i): 10 li.append(i) 11 print('hello ',i,li) 12 13 if __name__ == '__main__': 14 for i in range(2): 15 p = Process(target=foo,args=(i,)) 16 p.start() 17 print('son process', i, id(li)) 18 p.join() 19 print('end',li)
Array: 数组
数组在初始化的时候必须指明对象类型,且所有的对象都是同一个类型。
Array的内存地址是连续的
1 from multiprocessing import Process, Array 2 3 temp = Array('i',[11,22,33,44]) 4 5 def Foo(i,temp): 6 temp[i] = 100 +i 7 for item in temp:
8 print(i,'-->',item) 9 10 if __name__ == '__main__': 11 for i in range(2): 12 p = Process(target=Foo,args=(i,temp)) 13 p.start()
1 'c': ctypes.c_char, 'u': ctypes.c_wchar, 2 'b': ctypes.c_byte, 'B': ctypes.c_ubyte, 3 'h': ctypes.c_short, 'H': ctypes.c_ushort, 4 'i': ctypes.c_int, 'I': ctypes.c_uint, 5 'l': ctypes.c_long, 'L': ctypes.c_ulong, 6 'f': ctypes.c_float, 'd': ctypes.c_double
使用Manager.dict 实现数据共享
1 from multiprocessing import Process, Manager 2 3 4 def Foo(i,dic): 5 dic[i] = 100 +i 6 print('第 %d' %i ) 7 for k,v in dic.items(): 8 print(k,v) 9 10 11 if __name__ == '__main__': 12 manager = Manager() 13 dic = manager.dict() 14 for i in range(2): 15 p = Process(target=Foo,args=(i,dic)) 16 p.start() 17 p.join() 18 19 20 21 22 C:\Python35\python.exe D:/Python0618/homework/day10/a.py 23 第 0 24 0 100 25 第 1 26 0 100 27 1 101
进程锁
1 from multiprocessing import Process, Array, RLock 2 3 def Foo(lock, temp,i): 4 lock.acquire() 5 temp[i] = 100 + i 6 for item in temp: 7 print(i, item) 8 lock.release() 9 10 lock = RLock() 11 12 temp = Array('i',[11,22,33,44]) 13 14 if __name__ == '__main__': 15 for i in range(2): 16 p = Process(target = Foo,args=(lock,temp,i)) 17 p.start() 18 19 20 C:\Python35\python.exe D:/Python0618/homework/day10/a.py 21 0 100 22 0 22 23 0 33 24 0 44 25 1 100 26 1 101 27 1 33 28 1 44

浙公网安备 33010602011771号