Как я могу заставить mod_perl разрешить только один процесс на соединение? - PullRequest
0 голосов
/ 19 апреля 2010

У меня есть сценарий Perl CGI, который довольно ресурсоемкий (занимает около 2 секунд). Это нормально, если только 4 или 5 из них работают одновременно, и это обычно так.

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

Как я могу убедиться, что только один экземпляр этого процесса запущен на хосте?

Это старая система, которую я поддерживаю и которая использует старую платформу для внешнего интерфейса, и я хотел бы избежать использования javascript для отключения кнопки клиента, если это возможно. О преобразовании этого в fast-cgi perl также не может быть и речи, опять же, потому что это старая система, и добавление fast-cgi в apache может нарушить многие другие вещи, которые эта штука запускает.

1 Ответ

1 голос
/ 19 апреля 2010

Вы хотите использовать блокировку файла. Прочтите документацию по модулю Fcntl и функции flock: http://perldoc.perl.org/functions/flock.html

Редактировать в ответ на комментарий:

Пример использования файла блокировки:

#!/usr/bin/perl

use strict;
use warnings;

use Fcntl qw(:flock);

local *FH;
my $opened_file = open(FH,'>/tmp/example_file.lck');
if ($opened_file) {
    print "Lock file was opened successfully\n";
    if (flock(FH, &LOCK_EX | &LOCK_NB)) {
        &do_stuff();
    } else {
        print "Failed to get lock (another process is running)\n";
    }   
} else {
    print "Failed to open lock file: $!\n";
}
close(FH);

sub do_stuff {
    print "Locked!\n";
    sleep 30; # Pretending to be busy for a long time
}
...