0

这是一个 Web 服务器场景。Linux 是操作系统。不同的 IP 地址调用相同的脚本。

Linux 是否为每个脚本调用启动一个新的 Perl 进程,或者 Perl 是否交错运行多个调用,或者脚本是否连续运行(一个接一个)?

抱歉,我在 Google 的前几个结果中没有找到答案。

我需要知道才能知道我有多担心并发数据库访问。

脚本本身不使用多线程,它是一个简单的 Perl 脚本。

更新:更复杂的调度程序或评论序列化程序在下面回答,仍然未经测试:

#! usr/bin/perl

use Fcntl;
use Time::HiRes;


sysopen(INDICATOR, "indicator", O_RDWR | O_APPEND); # filename hardcoded, must exist
flock(INDICATOR, LOCK_EX);
print INDICATOR $$."\n";    # print a value unique to this script
                            # in single-process context it's serial anyway
                            # in multi-process context the pid is unique
seek(INDICATOR,0,0);
my $firstline = <INDICATOR>;
close(INDICATOR);

while("$firstline" ne $$."\n")
{
    nanosleep(1000000);     # time your script to find a better value
    open(INDICATOR, "<", "indicator");
    $firstline = <INDICATOR>;
    close(INDICATOR);
}

do "transferHandler.pl";    # name of your script to run

sysopen(INDICATOR, "indicator", O_RDWR);
flock(INDICATOR, LOCK_EX);
my @content = <INDICATOR>;
shift @content;
truncate(INDICATOR,0);
seek(INDICATOR,0,0);
foreach $line(@content)
{
    print INDICATOR $line;
}
close(INDICATOR);

再次编辑:如果 perl 在单个进程中运行并且线程(交错)脚本本身,上述脚本将不起作用。这种情况是我提出的三个问题中唯一的一个,根据我分别口头得到的答案和反馈,情况似乎并非如此。上面的脚本可以通过将唯一值更改为随机数而不是快速思考的 pid 来工作。

4

2 回答 2

2

这完全取决于您的 Web 服务器的设置。它是否使用普通 CGI、FastCGI、mod_perl?您可以设置您描述的两种方案。在 FastCGI 的情况下,您还可以设置一个永远不会退出的脚本,而是在一个循环中完成所有工作,该循环不断接受来自前端 Web 服务器的连接。

关于您的问题的更新,我建议您从一开始就开始担心并发访问。除非您正在做一些绝对个人的应用程序并故意将您的服务器设置为严格运行您的脚本的一个副本,否则几乎任何其他站点有时都会成长为需要 2 个或更多并行处理脚本的东西。如果你提前计划好这个非常常见的任务,你会省去很多麻烦。即使您只有一个服务脚本,您也需要索引/清理/离线任务所做的任何事情,这将意味着再次并发访问。

于 2012-05-02T12:34:09.233 回答
0

如果 perl 脚本单独调用,它们将导致单独的进程。这是一个使用两个脚本的演示:

#master.pl
system('perl ./sleep.pl &');
system('perl ./sleep.pl &');
system('perl ./sleep.pl &');

#sleep.pl
sleep(10);

然后运行:

perl tmp.pl & (sleep 1 && ps -A | grep perl)
于 2012-05-02T12:41:05.010 回答