Многопроцессорная обработка Python - не удается завершить завершенные процессы? - PullRequest
0 голосов
/ 15 декабря 2018

Следующий код с использованием пакета многопроцессорной обработки выполняется бесконечно, и в результате появляется сообщение об ошибке «дочерний процесс не создан»:

if __name__ == '__main__':
data = xlrd.open_workbook("workbook.xlsx")
data_all=[]
for sheetname in data.sheet_names() :
    #read all rows in all sheets into list of lists
    sh = data.sheet_by_name(sheetname)
    for rownum in range(sh.nrows) :
        data_all.append(sh.row_values(rownum))
data_chunks=np.array_split(data_all,5)  

output=mp.Queue()
processes=[mp.Process(target=main,args=(chunk_l,)) for chunk_l in data_chunks]

#runtime
start_time = time.time()
#Run processes
for p in processes:
    p.start()

#Exit completed processes
for p in processes:
    p.join()

#Get results from output queue
results=[output.get() for p in processes]

#runtime
end_time=time.time()

Через некоторое время я остановил процесс, и похоже, что он застрял вp.join ():

---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-11-83ace3c1f041> in <module>()
     20     #Exit completed processes
     21     for p in processes:
---> 22         p.join()
     23 
     24     #Get results from output queue

~/anaconda3/lib/python3.6/multiprocessing/process.py in join(self, timeout)
    122         assert self._parent_pid == os.getpid(), 'can only join a child process'
    123         assert self._popen is not None, 'can only join a started process'
--> 124         res = self._popen.wait(timeout)
    125         if res is not None:
    126             _children.discard(self)

~/anaconda3/lib/python3.6/multiprocessing/popen_fork.py in wait(self, timeout)
     49                     return None
     50             # This shouldn't block if wait() returned successfully.
---> 51             return self.poll(os.WNOHANG if timeout == 0.0 else 0)
     52         return self.returncode
     53 

~/anaconda3/lib/python3.6/multiprocessing/popen_fork.py in poll(self, flag)
     27             while True:
     28                 try:
---> 29                     pid, sts = os.waitpid(self.pid, flag)
     30                 except OSError as e:
     31                     # Child process not yet created. See #1731717

Функция main (), которую я использую для обработки, заканчивается на output.put для сохранения результатов, полученных данным фрагментом данных.Я почти уверен, что он выполняется полностью на основе операторов print после output.put (), которые работают, что, насколько я понимаю, будет означать, что дочерний процесс был создан и запущен.У кого-нибудь есть идеи как это отладить?

...