Поток внутри приложения против сервера - PullRequest
0 голосов
/ 18 февраля 2011

У меня есть сайт, который иногда занимает особенно много времени для обработки запроса (и это не является дефектом). В 99% случаев это довольно быстро, потому что почти не обрабатывает.

Я хочу показать сообщение с надписью «Загрузка», когда сайт обрабатывает запрос долго. Мой сайт использует mod_wsgi и Apache. Как я вижу, я отвечал бы «Загрузка» перед завершением обработки и делал одно из двух прямо перед этим:

-создать (демон) поток, чтобы позаботиться об обработке.

-связать через сокет с другим процессом и сказать ему, чтобы он позаботился об обработке (скорее всего, отправьте запрос на http://localhost:8080/do_processing).

Каковы плюсы и минусы одного подхода против другого?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2011

Использование отдельного процесса лучше.Это не обязательно должно быть сложно, как предлагается в другом ответе, поскольку вы можете использовать существующую систему для выполнения именно этого, например, Celery (http://celeryproject.org/). Опора на потоки процесса - не обязательно хорошая идея, если вы не собираетесь реализоватьсобственная система организации очередей заданий для предотвращения вытеснения нескольких потоков.Также в конфигурации многопроцессорного сервера нельзя гарантировать, что запрос возвращается к тому же процессу, и поэтому непросто получить статус выполняемой операции. Наконец,процессы веб-сервера могут быть убиты, и, следовательно, ваша фоновая задача также может быть убита до ее завершения. Вам потребуется механизм для сохранения состояния, который может пережить такое событие, если это важно. Гораздо проще использовать что-то вроде Celery.

0 голосов
/ 18 февраля 2011

Маршрут процесса требует немного системной обработки. Создание отдельного процесса является относительно дорогим и медленным. Однако, если ваш процесс завершится сбоем, это не повлияет на ваш основной процесс управления (вы получите код состояния выхода и сможете повторно запустить новый рабочий процесс). Вам также понадобится некоторый слой InterProcessCommunication (может быть сокетом, каналом, общей памятью и т. Д.), Который добавляет сложности вашему проекту.

Нитки легкие и дешевые. Все, что вам нужно сделать, это управлять одновременным доступом к общим ресурсам. Так что это действительно зависит от задачи, которую вы имеете в виду. Потоки, вероятно, будут более подходящим способом для реализации вашей задачи.

...