0

これは Web サーバーのシナリオです。Linux は OS です。異なる 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 が単一のプロセスで実行され、スレッド (インターリーブ) 自体がスクリプトである場合、上記のスクリプトは機能しません。このようなシナリオは、私が個別に口頭で得た回答とフィードバックに基づいて、そうではないように思われる、私が尋ねた 3 つのシナリオのうちの 1 つだけです。上記のスクリプトは、一意の値をpidではなく乱数に変更することで機能させることができますが、すぐに考えてみてください。

4

2 に答える 2

2

Web サーバーの設定に完全に依存します。プレーン CGI、FastCGI、mod_perl を使用していますか? 説明した両方のシナリオを設定できます。FastCGI の場合、スクリプトが終了しないように設定することもできますが、フロントエンド Web サーバーからの接続を受け入れ続けるループ内ですべての作業を行います。

質問の更新については、最初から同時アクセスについて心配することをお勧めします。完全に個人的なアプリケーションを実行していて、スクリプトの 1 つのコピーを厳密に実行するようにサーバーを意図的にセットアップしない限り、他のほとんどのサイトは、2 つ以上の並列処理スクリプトを必要とするものに成長することがあります。この非常に一般的なタスクを前もって計画しておくと、頭痛の種を大幅に減らすことができます。サービング スクリプトが 1 つしかない場合でも、インデックス作成/クリーンアップ/オフライン タスクによって実行されるすべての処理が必要になり、これは再び同時アクセスを意味します。

于 2012-05-02T12:34:09.233 に答える
0

perlスクリプトが個別に呼び出された場合、それらは個別のプロセスになります。2つのスクリプトを使用したデモを次に示します。

#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 に答える