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