这是一个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。
答案 0 :(得分:2)
完全取决于您的Web服务器的设置。它使用普通的CGI,FastCGI,mod_perl吗?您可以设置您已描述的两种方案。在FastCGI的情况下,您还可以设置脚本永不退出,但在循环中完成所有工作,继续接受来自前端Web服务器的连接。
关于您的问题的更新,我建议您从一开始就担心并发访问。除非您正在做一些绝对个人化的应用程序并故意设置您的服务器以严格运行脚本的一个副本,否则几乎任何其他站点有时会变成需要2个或更多并行处理脚本的东西。如果您提前计划这项非常常见的任务,您将为自己省去很多麻烦。即使您只有一个服务脚本,您也需要索引/清理/离线任务完成的任何操作,这将意味着再次进行并发访问。
答案 1 :(得分: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)