общие данные с использованием нескольких процессоров в Python - PullRequest
3 голосов
/ 26 января 2010

У меня интенсивный код процессора, который использует тяжелый словарь в качестве данных (около 250 миллионов данных). У меня есть многоядерный процессор, и я хочу использовать его, чтобы я мог выполнять более одной задачи одновременно. Словарь в основном только для чтения и может обновляться один раз в день.
Как я могу написать это на Python без дублирования словаря?
Я понимаю, что потоки Python не используют собственные потоки и не будут предлагать истинный параллелизм. Могу ли я использовать многопроцессорный модуль без сериализации данных между процессами?

Я из мира Java, и мое требование должно быть чем-то вроде потоков Java, которые могут обмениваться данными, работать на нескольких процессорах и предлагать примитивы синхронизации.

Ответы [ 3 ]

1 голос
/ 26 января 2010

Вы можете обмениваться данными, доступными только для чтения, между процессами просто с помощью fork (в Unix; в Windows нелегкий путь), но это не поймет «изменение один раз в день» (вам нужно поставить явный способ на месте для каждого процесса обновить свою копию). Нативные структуры Python, такие как dict, просто не предназначены для использования по произвольным адресам в разделяемой памяти (вам придется кодировать вариант dict, поддерживающий это в C), поэтому они не предлагают утешения.

Вы можете использовать Jython (или IronPython), чтобы получить реализацию Python с теми же возможностями многопоточности, что и в Java (или, соответственно, C #), включая использование нескольких процессоров несколькими одновременными потоками.

1 голос
/ 26 января 2010

Используйте shelve для словаря. Поскольку записи происходят редко, не должно быть проблем с их совместным использованием.

0 голосов
/ 26 января 2010

Посмотрите на это в stdlib: http://docs.python.org/library/multiprocessing.html Существует множество замечательных функций, которые позволят вам очень легко делиться структурами данных между процессами.

...