Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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_Python 3.x_Import_Multiprocessing_Spyder - Fatal编程技术网

Python—尽管代码是正确的,但多处理突然陷入困境

Python—尽管代码是正确的,但多处理突然陷入困境,python,python-3.x,import,multiprocessing,spyder,Python,Python 3.x,Import,Multiprocessing,Spyder,在过去的几个小时里,我用python开发了多处理工具。我做的最后一件事是建立一个有几个工人的池来执行一个函数。一切都进行得很好,多处理也在工作 在我切换到另一个文件以在实际项目中实现我的多处理洞察之后,代码正在运行,但是apply\u async(func,args)之后的.get()调用从未返回任何内容 我原以为这是由于一个错误的实现,但结果却是另一回事。我回到了我做实验的第一个文件,并试图再次运行这个文件。突然,这里的多重处理也不再起作用了。除了尝试在我的项目中实现多处理之外,我没有在代码或

在过去的几个小时里,我用python开发了多处理工具。我做的最后一件事是建立一个有几个工人的池来执行一个函数。一切都进行得很好,多处理也在工作

在我切换到另一个文件以在实际项目中实现我的多处理洞察之后,代码正在运行,但是
apply\u async(func,args)
之后的
.get()
调用从未返回任何内容

我原以为这是由于一个错误的实现,但结果却是另一回事。我回到了我做实验的第一个文件,并试图再次运行这个文件。突然,这里的多重处理也不再起作用了。除了尝试在我的项目中实现多处理之外,我没有在代码或环境上做任何其他事情。唯一可能与此问题相关的是,我试图在同一环境中执行较旧版本的
\uuuuuu main\uuuu
程序,这导致了一个错误,因为
\uuuuuu main\uuuu
文件需要执行较新的项目文件

下面是我用于简单实验的代码:

import torch.multiprocessing as mp

import torch
import time

*#thats code from my project*
import data.preprocessor as preprocessor
import eco_neat_t1_cfg as cfg


def f(x):
   return x*x    

if __name__ == "__main__":   
   p = mp.Pool(1)
   j = p.apply_async(f, (5,))
   r = j.get(timeout=10)
   print(r)
所以这里没什么复杂的,它应该能工作。 但是,没有返回任何结果。我注意到CPU是根据调用的进程数工作的,所以我假设它被某种循环捕获

我在Win10上运行,Python在带有IPython控制台的Anaconda Spyder上运行

当我关闭Spyder和所有Python进程时,重新启动并再次执行它——它可以工作,但前提是我没有导入自己的代码。一旦我将
eco_neat_t1_cfg导入为cfg
,它基本上只是一个数据类和一些其他导入,程序将不会返回任何内容,并且会在执行过程中卡住

我得到一个
重新加载的模块:data,data.preprocessor,data.generator
错误。这可能是因为
cfg
还导入数据。预处理器。奇怪的是,如果我现在从源代码中删除所有导入,保存文件并运行它,它将再次工作,尽管导入甚至不再在代码中指定。。。但是,每次重新启动Python和Spyder时,我都需要再次指定模块ofc

此外,在删除所有导入后,简单的代码仍能正常工作,但我实际上想要执行的更复杂的代码却不能,尽管在这一切发生之前,它是完美的。现在我得到了一个
PicklingError:Can't pickle:它与neat.genetic.genome.picklable_genome
错误不同。正如我所说,以前的酸洗并没有问题。这是我传递给
apply\u async
的“更复杂”的代码

def create_net(genome):

   net = feedforward.Net("cpu", genome, 1.0)

   inp = torch.ones(2, 5)
   input = torch.FloatTensor(inp).view(1, -1).squeeze()

   res = net(input)
   return res
我所做的是删除项目中的所有pycache,同时重置Spyder设置并更新Anaconda和Spyder。我还试图查看
cfg
文件的每一段代码,但即使我删除了每一行,也没有导入,程序也无法运行。没有任何帮助,我真的不知道问题出在哪里以及如何解决它。也许你们中有人有个主意

还有一件事要说,如果我手动中断(CTRL+C)执行,我会在stacktrace中注意到进程正在等待

 File "C:/Users/klein/Desktop/bak/test/eco_neat_t1/blabla.py", line 72, in <module>
r = j.get(timeout=10)

 File "C:\Users\klein\Anaconda3\envs\eco_neat\lib\multiprocessi\pool.py", line 651, in get
self.wait(timeout)

 File "C:\Users\klein\Anaconda3\envs\eco_neat\lib\multiprocessing\pool.py", line 648, in wait
self._event.wait(timeout)

 File "C:\Users\klein\Anaconda3\envs\eco_neat\lib\threading.py", line 552, in wait
signaled = self._cond.wait(timeout)
文件“C:/Users/klein/Desktop/bak/test/eco_neat_t1/blabla.py”,第72行,在
r=j.get(超时=10)
文件“C:\Users\klein\Anaconda3\envs\eco_-niat\lib\multiprocessi\pool.py”,第651行,在get中
self.wait(超时)
文件“C:\Users\klein\Anaconda3\envs\eco\u-niat\lib\multiprocessing\pool.py”,第648行,正在等待
self.\u事件等待(超时)
文件“C:\Users\klein\Anaconda3\envs\eco\u neat\lib\threading.py”,第552行,正在等待
信号=自身。第二次等待(超时)
干杯

解决方案:这个错误是我的目录结构导致python失败的原因。我的
\uuuu main\uuuu
测试文件都运行在
root/tests/eco\u neat\u t1
目录中。我在根目录中创建了两个具有相同内容的新文件
t1\u cfg
t1
。突然间一切都好了…奇怪的世界