Python - 多处理过程模块 - 未定义函数变量?



我正在尝试测试一些多处理代码。 下面的代码工作正常:

from multiprocessing import Process
def print_func(continent='Asia'):
print('The name of continent is : ', continent)
if __name__ == "__main__":  
names = ['America', 'Europe', 'Africa']
procs = []
proc = Process(target=print_func)  # instantiating without any argument
procs.append(proc)
proc.start()
# instantiating process with arguments
for name in names:
# print(name)
proc = Process(target=print_func, args=(name,))
procs.append(proc)
proc.start()
# complete the processes
for proc in procs:
proc.join()

但是,如果我在if __name__ == "__main__":中添加一个新变量,并在target中使用该变量,则target函数无法识别该变量。

def print_func(continent='Asia'):
print('The name of continent is : ', continent, ' ', t)
if __name__ == "__main__":  # confirms that the code is under main function
names = ['America', 'Europe', 'Africa']
t = 'continent'
procs = []
proc = Process(target=print_func)  # instantiating without any argument
procs.append(proc)
proc.start()
# instantiating process with arguments
for name in names:
# print(name)
proc = Process(target=print_func, args=(name,))
procs.append(proc)
proc.start()
# complete the processes
for proc in procs:
proc.join()

它将有错误:NameError: name t is not defined.此错误对我来说看起来很奇怪,这是不合理的,因为在下面的简单代码中不会出现此问题:

import pandas as pd
def my_func(c):
f['b'] = c
print(f)
if __name__ == "__main__":
f = pd.DataFrame({'a':[1,2,3]})
my_func(2)

那么是什么导致了名称错误?

在这里回答我的问题。Manager(( 可能是解决方案。在下面的代码中,除了访问字符串t之外,我还展示了如何访问其他python对象,例如pandas DataFrame。

from multiprocessing import Process, Manager
import pandas as pd
import numpy as np
def print_func(ns, continent='Asia'):
p_pd = ns.df
p_pd.iloc[0] = continent
print('The name of continent is : ', continent, ' ', ns.t)
print(p_pd.iloc[0])
if __name__ == "__main__":  # confirms that the code is under main function
mgr = Manager()
ns = mgr.Namespace()
names = ['America', 'Europe', 'Africa']
ns.t = 'continent'
ns.df = pd.DataFrame(np.ones((2,5)))
procs = []
# instantiating process with arguments
for name in names:
# print(name)
proc = Process(target=print_func, args=(ns, name))
procs.append(proc)
proc.start()
# complete the processes
for proc in procs:
proc.join()

最新更新