Последние несколько часов я провел на многопроцессорном инструменте в python. Последнее, что я сделал, это настроил пул с несколькими работниками для выполнения функции. Все было хорошо, и многопроцессорная работа.
После того, как я переключился на другой файл, чтобы реализовать мои многопроцессорные идеи в моем реальном проекте, код работал, но вызов .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)
Так что ничего сложного здесь, на самом деле должно работать.
Однако результат не возвращается. Я заметил, что процессор работает в соответствии с числом запущенных процессов, поэтому я предполагаю, что он зацикливается на каком-то цикле.
Я работаю на Win10, а Python работает на Anaconda Spyder с консолью IPython.
Когда я закрываю Spyder и все процессы Python, перезапускаю и запускаю его снова, это работает, но только если я не импортирую свой собственный код. После того, как я импортирую eco_neat_t1_cfg as cfg
, который является в основном только классом данных с несколькими другими импортами, программа не будет ничего возвращать и застревает в выполнении.
Я получаю Reloaded modules: data, data.preprocessor, data.generator
ошибку. Вероятно, это связано с тем, что cfg
также импортирует data.preprocessor. Странно то, что если я сейчас удаляю все импорта из исходного кода, сохраняю файл и запускаю его, он снова будет работать, хотя импорт даже не указан в коде ... однако, каждый раз, когда я перезагружаю Python и Spyder, мне нужно снова указывать модули ofc.
Кроме того, простой код работает после удаления всех импортов, но более сложный, который я на самом деле хочу выполнить, - нет, хотя до того, как все это произошло, все было прекрасно. Теперь я получаю ошибку 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
с одинаковым содержимым в корневом каталоге. Вдруг все работает нормально ... странный мир