Следующий код с использованием пакета многопроцессорной обработки выполняется бесконечно, и в результате появляется сообщение об ошибке «дочерний процесс не создан»:
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 (), которые работают, что, насколько я понимаю, будет означать, что дочерний процесс был создан и запущен.У кого-нибудь есть идеи как это отладить?