Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多处理没有给出预期的结果_Python_Multiprocessing - Fatal编程技术网

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

我不熟悉python的多处理,我正在学习一门课程,我发现代码没有像他们在教程中说的那样工作。例如:
此代码:

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)