Я попытался поставить цикл for параллельно, чтобы ускорить некоторый код. считают это:Python multiprocessing.Pool.map умирает молча
from multiprocessing import Pool
results = []
def do_stuff(str):
print str
results.append(str)
p = Pool(4)
p.map(do_stuff, ['str1','str2','str3',...]) # many strings here ~ 2000
p.close()
print results
У меня есть некоторые отладочные сообщения, показывающие от do_stuff
отслеживать, насколько программа получает перед смертью. Кажется, он умирает в разных точках каждый раз. Например, он напечатает «str297», а затем он просто перестанет работать, я увижу, что все процессоры перестают работать, и программа просто сидит там. Должно возникнуть некоторая ошибка, но нет сообщения об ошибке. Кто-нибудь знает, как отладить эту проблему?
UPDATE
Я попытался повторно работать Кодекса немного. Вместо того, чтобы использовать функцию map
Я попробовал apply_async
функцию:
pool = Pool(5)
results = pool.map(do_sym, underlyings[0::10])
results = []
for sym in underlyings[0::10]:
r = pool.apply_async(do_sym, [sym])
results.append(r)
pool.close()
pool.join()
for result in results:
print result.get(timeout=1000)
Это работало так же хорошо, как функции map
, но в конечном итоге висит таким же образом. Он никогда не попадет в цикл for, где он печатает результаты.
После того, как вы немного поработали над этим, и попробовав некоторые отладочные записи, как это было предложено в ответе unutbu, я приведу здесь дополнительную информацию. Проблема очень странная. Кажется, что пул просто висит там и не может закрыть и продолжить программу. Я использую среду PyDev для тестирования своих программ, но я думал, что попробую запустить python в консоли. В консоли я получаю такое же поведение, но когда я нажимаю Ctrl + C, чтобы убить программу, я получаю некоторый вывод, который мог бы объяснить, где проблема:
> KeyboardInterrupt ^CProcess PoolWorker-47: Traceback (most recent call
> last): File "/usr/lib/python2.7/multiprocessing/process.py", line
> 258, in _bootstrap Process PoolWorker-48: Traceback (most recent call
> last): File "/usr/lib/python2.7/multiprocessing/process.py", line
> 258, in _bootstrap Process PoolWorker-45: Process PoolWorker-46:
> Process PoolWorker-44:
> self.run() File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
> self._target(*self._args, **self._kwargs) File "/usr/lib/python2.7/multiprocessing/pool.py", line 102, in worker
> Traceback (most recent call last): Traceback (most recent call last):
> Traceback (most recent call last): File
> "/usr/lib/python2.7/multiprocessing/process.py", line 258, in
> _bootstrap File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap File
> "/usr/lib/python2.7/multiprocessing/process.py", line 258, in
> _bootstrap
> task = get() File "/usr/lib/python2.7/multiprocessing/queues.py", line 374, in get
> self.run() File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
> racquire()
> self._target(*self._args, **self._kwargs) File "/usr/lib/python2.7/multiprocessing/pool.py", line 102, in worker
> KeyboardInterrupt
> task = get() File "/usr/lib/python2.7/multiprocessing/queues.py", line 374, in get
> self.run()
> self.run() File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
> self.run() File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run File
> "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
> self._target(*self._args, **self._kwargs) File "/usr/lib/python2.7/multiprocessing/pool.py", line 102, in worker
> self._target(*self._args, **self._kwargs)
> self._target(*self._args, **self._kwargs) File "/usr/lib/python2.7/multiprocessing/pool.py", line 102, in worker
> racquire() File "/usr/lib/python2.7/multiprocessing/pool.py", line 102, in worker KeyboardInterrupt
> task = get() File "/usr/lib/python2.7/multiprocessing/queues.py", line 374, in get
> task = get()
> task = get() File "/usr/lib/python2.7/multiprocessing/queues.py", line 376, in get
> File "/usr/lib/python2.7/multiprocessing/queues.py", line 374, in get
> racquire()
> return recv()
> racquire() KeyboardInterrupt KeyboardInterrupt KeyboardInterrupt
Тогда на самом деле программа никогда не умирает. Мне нужно закрыть окно терминала, чтобы убить его.
UPDATE 2
я сузил проблему внутри функции, которая выполняется в бассейне, и это была транзакция базы данных MySQL, которая была причина проблемы. Раньше я использовал пакет MySQLdb
. Я включил функцию a pandas.read_sql
для транзакции, и теперь она работает.
'results' не будет использоваться совместно между процессами. Кроме того, каждый процесс будет реимпортировать модуль и создать новую функцию «Пул» и «Карта». Вам нужно установить их в отдельный блок '__main__'. См. [Docs] (https://docs.python.org/2/library/multiprocessing.html#windows). –
результаты не обязательно должны быть разделены, пока все результаты будут добавлены в конце концов. Это должно работать, не так ли? –