Python - мультипроцессор внезапно зависает, хотя код верен - PullRequest
0 голосов
/ 16 мая 2019

Последние несколько часов я провел на многопроцессорном инструменте в 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 с одинаковым содержимым в корневом каталоге. Вдруг все работает нормально ... странный мир

...