我花了最后几个小时在python的多处理工具上。我要做的最后一件事是建立一个由几个工作人员执行的Pool。一切都很好,并且多处理正常。
在我切换到另一个文件以在我的实际项目中实现我的多处理洞察力之后,代码正在运行,但是.get()
之后的apply_async(func, args)
调用从未返回任何内容。
我认为这是由于错误的实现所致,但事实证明还有其他原因。我回到第一个文件进行实验,然后尝试再次运行它。突然之间,多处理也不再起作用。除了尝试在我的项目中实现多处理之外,我实际上并没有对代码或环境做任何其他事情。可能与此问题相关的唯一一件事是,我试图在相同的环境中执行__main__
程序的较旧版本,由于__main__
文件进入了较新的项目文件才能执行,导致出现错误。
这是我用于简单实验的代码:
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 as cfg
(基本上只是一个带有其他几个导入的数据类)后,程序将不会返回任何内容,并且会卡在执行过程中。
我遇到Reloaded modules: data, data.preprocessor, data.generator
错误。这可能是因为cfg
也导入了data.preprocessor。奇怪的是,如果我现在从源代码中删除 all 导入,保存文件并运行它,它将再次运行,尽管在代码中甚至不再指定导入...但是,每次我重新启动Python和Spyder时,我都需要再次指定模块c。
此外,简单的代码在删除所有导入后都可以工作,但是实际上我想执行的更复杂的代码却没有,尽管在所有这些事情发生之前完全可以。现在,我收到一个PicklingError: Can't pickle <class 'neat.genotype.genome.Pickleable_Genome'>: it's not the same object as neat.genotype.genome.Pickleable_Genome
错误。正如我所说,以前的酸洗没有问题。那就是我传递给apply_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)执行,那么在堆栈跟踪中我会注意到进程正在等待。
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)
欢呼
解决方案:该错误是我的目录结构,导致python失败。我的两个__main__
测试文件都在root/tests/eco_neat_t1
目录中运行。我在根目录中有两个具有相同内容的新文件t1_cfg
和t1
。突然一切正常……奇怪的世界