三十一、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

 

posted @ 2016-07-26 19:42  咖啡茶  阅读(80)  评论(0)    收藏  举报