Perl CGI темы - PullRequest
       40

Perl CGI темы

2 голосов
/ 02 июля 2011

У меня небольшая проблема с моим веб-приложением cgi, я использую ithreads для некоторой параллельной обработки, где у всех потоков есть общая «цель».Таким образом я отсоединяю их всех, и как только я нахожу свой ответ, я вызываю выход.Однако проблема в том, что сценарий фактически продолжит обработку даже после того, как пользователь закрыл соединение и ушел, что, конечно, если проблема связана с ресурсами.Есть ли способ принудительно завершить работу родительского процесса, если пользователь отключился?

Ответы [ 4 ]

4 голосов
/ 13 июля 2011

Если вы работаете под Apache, если клиент преждевременно закрывает соединение, он отправляет SIGTERM процессу cgi. В моем простом тестировании это убивает скрипт и потоки как поведение по умолчанию.

Однако, если есть прокси между сервером и клиентом, возможно, что Apache не сможет обнаружить закрытое соединение (так как соединение от сервера к прокси может оставаться открытым) - в этом случае вы вам не повезло.

3 голосов
/ 02 июля 2011

AFAIK создание и уничтожение потоков не является (по крайней мере, на данный момент) хорошей практикой Perl, поскольку он постоянно увеличивает использование памяти!
Вы должны думать как-то иначе, чтобы выполнить работу. Обычно решением является создание пула потоков и отправка аргументов с помощью общего массива или Thread :: Queue .

1 голос
/ 17 июля 2011

Я бы лично предложил изменить ваш подход и при создании этих потоков для клиентского подключения сохранить и связать PID каждого потока с клиентским подключением. Мне лично нравится использовать демонов вместо потоков, т.е. Proc :: Daemon. Когда клиент преждевременно отключается (до окончания потоков), отправьте SIGTERM каждому идентификатору процесса, связанному с этим клиентом.

Для корректного выхода переопределите подпрограмму завершения в процессе потока с условием остановки, например что-то вроде:

$SIG{TERM} = sub { $continue = 0; };

Где $ continue будет условием цикла обработки потока. Вам все равно придется остерегаться ошибок в коде, потому что даже если вы можете попробовать переопределить $SIG{__DIE__}, метод die () обычно не учитывает это и умирает мгновенно без изящества;) (по крайней мере из моего опыта)

0 голосов
/ 15 июля 2011

Я не уверен, как вы узнаете, отключился ли пользователь, но, если он есть, вам придется самим останавливать потоки, поскольку они, очевидно, не уничтожаются автоматически.

Уничтожение потоков - опасная операция, поэтому не существует хорошего способа сделать это.

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

Вы также можете отправить сигнал темам, чтобы убить их. Документы знают об этом больше, чем я.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...