如何强制mod_perl只允许每个连接一个进程?

时间:2010-04-19 00:19:21

标签: perl cgi process

我有一个相当资源密集的perl cgi脚本(大约需要2秒钟才能完成)。只要最多只有4个或5个同时运行,通常情况就是如此。

问题是,当用户单击调用此脚本的链接时,会生成一个新进程来处理该连接请求,因此如果用户多次单击(如果他们不耐烦),则服务器会因新的问题而过载进程正在运行,其中大多数是冗余的。

如何确保每个主机只运行此进程的一个实例?

这是我正在维护的旧系统,它使用旧框架作为前端,我想尽可能避免使用javascript来禁用按钮客户端。将其转换为fast-cgi perl也是不可能的,因为这是一个旧系统,并且向apache添加fast-cgi可能会破坏此事运行的许多其他事情。

1 个答案:

答案 0 :(得分:1)

您想要使用文件锁。阅读有关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
}