我有这样的一段代码。
但这样不行,这句话的意思是:
问题是:发生了什么?为什么
编辑: 我使用Linux。
编辑2: 根据@Bill的第二个建议,我现在有了以下代码:
def plotFrame(n):
a = data[n, :]
do_something_with(a)
data = loadtxt(filename)
ids = data[:,0] # some numbers from the first column of data
map(plotFrame, ids)
这对我来说很有效。现在我想尝试用pool.map()
替换map()
,如下所示:
pools = multiprocessing.Pool(processes=1)
pools.map(plotFrame, ids)
但这样不行,这句话的意思是:
NameError: global name 'data' is not defined
问题是:发生了什么?为什么
map()
不会抱怨未传递到函数的data
变量,而 pool.map()
会抱怨?编辑: 我使用Linux。
编辑2: 根据@Bill的第二个建议,我现在有了以下代码:
def plotFrame_v2(line):
plot_with(line)
if __name__ == "__main__":
ff = np.loadtxt(filename)
m = int( max(ff[:,-1]) ) # max id
l = ff.shape[0]
nfig = 0
pool = Pool(processes=1)
for i in range(0, l/m, 50):
data = ff[i*m:(i+1)*m, :] # data of one frame contains several ids
pool.map(plotFrame_v2, data)
nfig += 1
plt.savefig("figs_bot/%.3d.png"%nfig)
plt.clf()
这正如预期的那样工作。然而,现在我又遇到了一个意想不到的问题:生成的图表是空白的,而使用 map()
的上面的代码会产生带有 data
内容的图表。
multiprocessing
时最好不要依赖全局变量;特别是在Windows上,生成的子进程可能无法看到全局变量的更改。 - Martijn Pieters