Я пытаюсь использовать многопроцессорность в python (2.7.8) на Mac OSX. Прочитав ответ Велимира Млакера на этот question, я смог использовать multiprocessing.Pool() для многопроцессорности простой функции, но она не работает с моей фактической функцией. Я получаю правильные результаты, но он выполняется последовательно. Я считаю, что проблема в том, что моя функция петли поверх music21.stream(), которая похожа на список, но имеет специальную функциональность для музыкальных данных. Я считаю, что потоки music21 не могут быть маринованными, так есть ли какая-то многопроцессорная альтернатива пулу, которую я могу использовать? Я не возражаю, если результаты возвращаются не по порядку, и при необходимости я могу перейти на другую версию python. Я включил свой код для многопроцессорной задачи, но не для функции stream_indexer(), которую он вызывает. Спасибо!Многопроцессорные задачи на питоне, которые нельзя мариновать?
import multiprocessing as mp
def basik(test_piece, part_numbers):
jobs = []
for i in part_numbers:
# Each 2-tuple in jobs has an index <i> and a music21 stream that
# corresponds to an individual part in a musical score.
jobs.append((i, test_piece.parts[i]))
pool = mp.Pool(processes=4)
results = pool.map(stream_indexer, jobs)
pool.close()
pool.join()
return results
Какая операционная система (mp работает по-разному на окнах)? Это не проблема рассола или вы получите исключение. Является ли поток в памяти? mp может сериализоваться и передавать весь поток работнику. – tdelaney
Спасибо за ваш вклад, я работаю в Mac OSX. Программа определенно работает серийно, когда ей предоставляются потоки, и каждый кортеж в списке имеет поток, поскольку это второй элемент, но почему это приведет к его серийному запуску? Также как я мог избежать передачи всего потока каждому работнику? –
Alex
Можете ли вы отложить создание потока для рабочего? Это поможет распараллелить. Вы также можете попробовать поместить поток в глобальный список, прежде чем создавать пул и передавать указатель списка работнику. Поскольку дочерний элемент получает копию в виде записи родительской памяти, она уже будет там. Если потоки находятся на диске, вы в конечном счете зависите от скорости хранения. – tdelaney