【发布时间】:2020-02-12 15:41:09
【问题描述】:
我试图测试一些多处理代码。下面的代码工作正常:
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)
那么导致 NameError 的原因是什么?
【问题讨论】:
-
@stovfl 现在我知道不建议跨进程共享数据。但是,有没有办法让多个进程同时共享同一个 pd.DataFrame?似乎可以共享值/字符串/列表/字典,但不确定 DataFrame 是否也可共享。
-
@stovfl 使用来自 Manager() 的 Namespace() 似乎工作...
-
“使用来自
Manager()的Namespace()似乎有效”:随意发布社区 wiki 答案,右下方复选框展示你的解决方案。
标签: python function process python-multiprocessing nameerror