2010-04-29 2 views
1

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

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

Благодаря

ответ

2

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

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

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

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

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

+0

@JudoWill Спасибо. Итак, если я правильно понимаю, «Семафор» будет защищать систему от когда-либо более 10 потоков, открытых из этой одной области кода (т. Е. Не будет блокировать больше интерпретаторов от запуска else, если я использую потоки в 5 местах и ​​т. Д.), ? – orokusaki

+0

@orokusaki. Фактически в вашем случае вам нужно найти способ обойти «тот же самый» объект «Семафор» между всеми вашими функциями. Если вы определяете его один раз «глобально», то он должен быть одним и тем же экземпляром через все ваши вызовы (или, по крайней мере, до тех пор, пока ваш основной процесс не перезагрузится) – JudoWill

1

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

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

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

+0

@Jared Спасибо. Мне, возможно, придется попробовать. Я буду использовать UWSGI. – orokusaki

2

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

Есть хороший шанс, что вы хотите асинхронную сетевую инфраструктуру, такую ​​как Twisted.

+0

@Mike, я не создаю новый процесс для каждого запроса. Я создаю новый процесс из своей программы только в том случае, если несколько изображений нуждаются в изменении размера на одном представлении в моем приложении. Это не имеет ничего общего с сетевыми вещами. Моя единственная проблема с Интернетом связана с несколькими клиентами, использующими ту же самую точную функцию, которая создает этот процесс. – orokusaki

+0

@orokusaki. У вас есть написанная в Python, связанная с процессором программа для изменения размера изображения, которую вы хотите запустить с большим количеством связи между ней и некоторым кодом, который ее запускает? –

+0

В принципе, когда пользователь переходит к '/ spam/upload /' и загружает изображение, я хочу использовать PIL для изменения размера изображения до 6 разных размеров и разгрузки каждого из них на S3.Каждый из них займет некоторое время, и я подумал, что было бы неплохо открыть 6 процессов, и в каждом из них: сделать одно изменение размера и отправить его на S3, так что запрос пользователя займет время примерно одного изменения размера/загрузки S3. – orokusaki