Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 当使用一个脚本多次调用时,/usr/bin/perl是否作为单独的进程运行?_Database_Multithreading_Perl_Scheduler - Fatal编程技术网

Database 当使用一个脚本多次调用时,/usr/bin/perl是否作为单独的进程运行?

Database 当使用一个脚本多次调用时,/usr/bin/perl是否作为单独的进程运行?,database,multithreading,perl,scheduler,Database,Multithreading,Perl,Scheduler,这是一个web服务器场景。Linux是操作系统。不同的IP地址调用相同的脚本 Linux是为每个脚本调用启动一个新的Perl进程,还是Perl交错运行多个调用,还是脚本连续运行(一个接一个) 很抱歉,我在Google的前几个结果中没有找到答案 我需要知道,为了知道我有多担心并发数据库访问 脚本本身没有使用多线程,它是一个简单的Perl脚本 更新:更复杂的调度器或注释序列化器,请回答以下问题,尚未测试: #! usr/bin/perl use Fcntl; use Time::HiRes;

这是一个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);
#!usr/bin/perl
使用Fcntl;
使用时间::雇佣;
sysopen(指示符,“指示符”,O|RDWR | O|U APPEND);#文件名硬编码,必须存在
植绒(指示器,锁紧装置);
打印指示器$$“\n”#打印此脚本特有的值
#在单进程上下文中,它是串行的
#在多进程环境中,pid是唯一的
寻道(指示器,0,0);
我的$firstline=;
关闭(指示灯);
而(“$firstline”ne$$。“\n”)
{
nanosleep(1000000)35;为脚本计时以找到更好的值

open(INDICATOR),这完全取决于您的web服务器的设置。它是否使用普通CGI、FastCGI、mod_perl?您可以设置您描述的两种场景。对于FastCGI,您还可以设置脚本永不退出,但在一个不断接受前端web服务器连接的循环中完成所有工作


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

如果单独调用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)

我无法对这个问题本身进行评论,但它会询问对perl二进制文件的多次调用是否会导致创建相应的新进程,而不是是否可能创建一个可以处理多个或同时请求的脚本。安装了FastCGI。您是否有关于如何设置有关该主题的FCGI的说明的链接?它是它不应该是一个高要求的应用程序。如果Linux会在必要时安排多次脚本调用,我会很高兴。或者我可以自己创建一个调度程序脚本吗?毕竟,n*串行或n并行在时间消耗上应该是相等的,即使有些需要等待更长的时间。但它是一个小脚本。这是一个很好的例子,对吗在模块文档概要中:实际上,我不太了解这个概要:例如,accept()是等待还是立即返回?(我猜它会等待。)如果文件存在,我将尝试在“创建文件作为已执行指示器”上创建一个计划脚本,如果文件存在,则使用睡眠来防止并发执行。如果它一开始不并发执行,该脚本也会工作。由于您的回答使它看起来依赖于Apache,我将尝试查找相关文档来设置并发性或不设置并发性。我将同样感谢指向此类文档的指针。accept()等待传入连接。当循环执行时,所有挂起的连接都由FCGI处理,并保持在队列中,直到脚本再次接受。您可以设置Apache(或任何服务器)维护一个或多个脚本副本。每个释放的脚本都将以FIFO顺序从队列中拾取新连接。谢谢,这样就可以了。不过,这里有一个未测试的计划程序:参数0=要运行的perl脚本,参数arg.1=作为指示符的文件名,参数arg.2=等待重试执行的纳秒数。我猜如果2调用interl在进行检查的同时,他们必须得到几乎相等的cpu指令计数器值或类似值。对预计的观众来说不太可能。
#!usr/bin/perl使用时间::HiRes;while(-e$ARGV[1]){nanosleep($ARGV[2])open INDICATOR,$ARGV[1];close INDICATOR;do$ARGV[0];unlink$ARGV[1];