【问题标题】:How can I force mod_perl to only allow one process per connection?如何强制 mod_perl 每个连接只允许一个进程?
【发布时间】:2010-04-19 10:00:41
【问题描述】:

我有一个占用大量资源的 perl cgi 脚本(大约需要 2 秒才能完成)。只要最多只有 4 或 5 个同时运行就可以了,通常情况就是这样。

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

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

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

【问题讨论】:

    标签: perl cgi process


    【解决方案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
    }
    

    【讨论】:

    • 你打算怎么做?
    • 仍然没有达到我想要的效果,但它确实回答了最初的问题,所以我会接受它
    猜你喜欢
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多