我试图从子进程返回值,但遗憾的是这些值是不可取消的.所以我在线程模块中使用了全局变量并且成功但在使用多处理模块时无法检索子进程中完成的更新.我希望我错过了一些东西.
最终打印的结果始终与给定vars dataDV03和dataDV04的初始值相同.子进程正在更新这些全局变量,但这些全局变量在父级中保持不变.
import multiprocessing
# NOT ABLE to get python to return values in passed variables.
ants = ['DV03', 'DV04']
dataDV03 = ['', '']
dataDV04 = {'driver': '', 'status': ''}
def getDV03CclDrivers(lib): # call global variable
global dataDV03
dataDV03[1] = 1
dataDV03[0] = 0
# eval( 'CCL.' + lib + '.' + lib + '( "DV03" )' ) these are unpicklable instantiations
def getDV04CclDrivers(lib, dataDV04): # pass global variable
dataDV04['driver'] = 0 # eval( 'CCL.' + lib + '.' …Run Code Online (Sandbox Code Playgroud) 可能重复:
Python多处理全局变量更新未返回到父级
我使用的是具有多个内核的计算机,并且为了性能优势,我应该使用多个.但是,我很困惑为什么这些代码不能达到我的预期:
from multiprocessing import Process
var = range(5)
def test_func(i):
global var
var[i] += 1
if __name__ == '__main__':
jobs = []
for i in xrange(5):
p = Process(target=test_func,args=(i,))
jobs.append(p)
p.start()
print var
Run Code Online (Sandbox Code Playgroud)
以及
from multiprocessing import Pool
var = range(5)
def test_func(i):
global var
var[i] += 1
if __name__ == '__main__':
p = Pool()
for i in xrange(5):
p.apply_async(test_func,[i])
print var
Run Code Online (Sandbox Code Playgroud)
我希望结果是,[1, 2, 3, 4, 5]但结果是[0, 1, 2, 3, 4].
在使用全局变量和进程时,我必须要有一些微妙之处.这是偶然的方式还是我应该避免尝试以这种方式更改变量?