0x03 共享变量
共享变量
多进程中的每个进程与多线程中不同, 是不会共享变量的, 所使用的变量每个进程都会独自拷贝一份, 如果使用共享变量, 直接使用Python中的对象是不可行的:
import os
from multiprocessing import Process
vip_list = []
def testFunc(cc):
vip_list.append(cc)
print('process id:', os.getpid())
if __name__ == '__main__':
threads = []
for ll in range(10):
t = Process(target=testFunc, args=(ll,))
t.daemon = True
threads.append(t)
for i in range(len(threads)):
threads[i].start()
for j in range(len(threads)):
threads[j].join()
print("------------------------")
print('process id:', os.getpid())
print(vip_list)
输出的结果为:
python aa.py
process id: 632
process id: 635
process id: 637
process id: 633
process id: 636
process id: 634
process id: 639
process id: 638
process id: 641
process id: 640
------------------------
process id: 619
[]
可以看到, 我们想让所有的进程把结果都存入到vip_list
中, 但是每个进程都不会把结果存进去, 仍然是一个空列表. 这是因为vip_list
列表不是一个共享变量, 不能被子进程使用.
可以使用multiprocessing
包自带的共享变量类来实现. 其中的Value, Array以及Manager类都可以作为共享变量, 被多个进程共享使用.
Value: 共享数值
Array共享列表
from multiprocessing import Process, Value, Array
def f(n, a):
n.value = 3.1415927
for i in range(len(a)):
a[i] = -a[i]
if __name__ == '__main__':
num = Value('d', 0.0)
arr = Array('i', range(10))
p = Process(target=f, args=(num, arr))
p.start()
p.join()
print num.value
print arr[:]
结果为:
3.1415927
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
Manager: 支持多种形式,
list
,dict
等Python对象以及Value
,Array
和Queue
,Event
,Lock
等并行同步工具. 只需要调用Manager
对象对应的属性.```python import os from multiprocessing import Process, Manager, Lock
lock = Lock() manager = Manager() sum = manager.Value('tmp', 0)
def testFunc(cc, lock): with lock: sum.value += cc
if name == 'main': threads = []
for ll in range(100):
t = Process(target=testFunc, args=(1, lock))
t.daemon = True
threads.append(t)
for i in range(len(threads)):
threads[i].start()
for j in range(len(threads)):
threads[j].join()
print("------------------------")
print('process id:', os.getpid())
print(sum.value)
```
参考资料
最后更新于
这有帮助吗?