Python - вопрос относительно одновременного использования `multiprocess` - PullRequest
1 голос
/ 29 апреля 2010

Я хочу использовать многопроцессорную обработку Python для одновременной обработки без использования блокировок (блокировки для меня являются противоположностью многопроцессорной обработки), потому что я хочу создавать несколько отчетов из разных ресурсов одновременно во время веб-запроса (обычно это занимает около 3 секунды, но с помощью многопроцессорной обработки я могу сделать это за 0,5 секунды).

Моя проблема в том, что, если я выставлю такую ​​функцию в Интернете и получу 10 пользователей, одновременно использующих один и тот же отчет, у меня вдруг откроется 60 переводчиков одновременно (, что приведет к сбою системы ). Это просто здравый смысл использования многопроцессорности, или есть хитрость, чтобы обойти этот потенциальный кошмар?

Спасибо

Ответы [ 3 ]

2 голосов
/ 29 апреля 2010

Вы лаете не на то дерево, если пытаетесь использовать multiprocess для добавления параллелизма в сетевое приложение. Вы лаете на полностью неправильное дерево, если вы создаете процессы для каждого запроса. multiprocess не то, что вы хотите (по крайней мере, в качестве модели параллелизма).

Есть хороший шанс, что вам понадобится асинхронная сетевая среда, такая как Twisted .

2 голосов
/ 29 апреля 2010

Если вы действительно беспокоитесь о слишком большом количестве экземпляров, вы можете подумать о защите вызова с помощью объекта семафора. Если я понимаю, что вы делаете, вы можете использовать объект семафора с резьбой:

from threading import Semaphore
sem = Semaphore(10)
with sem:
    make_multiprocessing_call()

Я предполагаю, что make_multiprocessing_call() очистит после себя.

Таким образом, только 10 «лишних» экземпляров python будут открыты, если поступит другой запрос, ему просто придется дождаться завершения предыдущего. К сожалению, это не будет в порядке «Очередь» ... или в любом другом порядке.

Надеюсь, что поможет

1 голос
/ 29 апреля 2010
Блокировки

всегда необходимы, если у вас есть несколько агентов , записывающих в источник. Если они только получают доступ, блокировки не нужны (и, как вы сказали, победите цель многопроцессорной обработки).

Вы уверены, что это приведет к краху системы? На веб-сервере, использующем CGI, каждый запрос порождает новый процесс, поэтому нет ничего необычного в том, чтобы видеть тысячи одновременных процессов (предоставленных в python, следует использовать wsgi и избегать этого), которые не вызывают сбой системы.

Я предлагаю вам проверить свою теорию - не должно быть трудностей в создании 10 одновременных обращений - и посмотрите, действительно ли ваш сервер дает сбой.

...