Python多处理没有给出预期的结果
我不熟悉python的多处理,我正在学习一门课程,我发现代码没有像他们在教程中说的那样工作。例如:Python多处理没有给出预期的结果,python,multiprocessing,Python,Multiprocessing,我不熟悉python的多处理,我正在学习一门课程,我发现代码没有像他们在教程中说的那样工作。例如: 此代码: import multiprocessing # empty list with global scope result = [] def square_list(mylist): """ function to square a given list """ global
此代码:
import multiprocessing
# empty list with global scope
result = []
def square_list(mylist):
"""
function to square a given list
"""
global result
# append squares of mylist to global list result
for num in mylist:
result.append(num * num)
# print global list result
print("Result(in process p1): {}".format(result))
if __name__ == "__main__":
# input list
mylist = [1,2,3,4]
# creating new process
p1 = multiprocessing.Process(target=square_list, args=(mylist,))
# starting process
p1.start()
# wait until process is finished
p1.join()
# print global result list
print("Result(in main program): {}".format(result))
应按照教程中的说明打印此结果:
Result(in process p1): [1, 4, 9, 16]
Result(in main program): []
但当我运行它时,它会打印出来
Result(in main program): []
我想这些散文甚至还没有开始。
我正在使用来自anaconda的python 3.7.9。
如何解决此问题?不要使用您同时访问的全局变量。全局变量在大多数情况下是一个非常糟糕的主意,应该非常小心地使用。 最简单的方法是使用
p.map
。(您不必启动/加入流程)
如果不想使用p.map
也可以使用q.put()
返回值,并使用q.get()
从函数中获取值
您还可以在此处找到在多处理函数中获得结果的示例:
无法复制。彻底检查代码。请确保您的子流程是从
p1.start()
开始的。我不知道您这边发生了什么,但它对我来说运行得非常好。IDE并不总是捕获其他流程的输出。它们可以重定向主进程的stdout
,但子进程不会继承更改。改为从命令行控制台运行它,或者让它将输出写入一个文件,以向自己证明进程已运行。您是否使用spider运行它?还是jupyterLab?或者只是执行文件?这就是global
的工作方式吗?这并不能回答OP的问题。教程的输出预期不会在主程序中修改全局设置。很可能这是在证明全局函数在多处理中不是“全局”的。OP的问题是看不到来自子流程的打印。
with Pool(5) as p:
result=p.map(square_list,mylist)