15

次のコードのマルチスレッドを実装する方法を知る必要があります。このスクリプトを毎秒呼び出す必要がありますが、スリープ タイマーは 2 秒後にスクリプトを処理します。全体で、スクリプトは 3 秒ごとに自分自身を呼び出します。しかし、私は毎秒それを呼び出す必要があります.誰かが私に解決策を提供してくれるか、正しい方向に向けてくれますか.

#!usr/bin/perl
use warnings;

sub print
{
local $gg = time;
print "$gg\n";
}

$oldtime = (time + 1);
while(1)
{
if(time > $oldtime)
{
    &print();
    sleep 2;
    $oldtime = (time + 1);
            }
        }

ほんの一例です。

4

1 に答える 1

42

スレッドを使用する簡単な例を次に示します。

use strict;
use warnings;
use threads;

sub threaded_task {
    threads->create(sub { 
        my $thr_id = threads->self->tid;
        print "Starting thread $thr_id\n";
        sleep 2; 
        print "Ending thread $thr_id\n";
        threads->detach(); #End thread.
    });
}

while (1)
{
    threaded_task();
    sleep 1;
}

これにより、毎秒スレッドが作成されます。スレッド自体は2秒間続きます。

スレッドの詳細については、ドキュメントを参照してください。重要な考慮事項は、変数がスレッド間で共有されないことです。新しいスレッドを開始すると、すべての変数の複製コピーが作成されます。

共有変数が必要な場合は、を調べてthreads::sharedください。

ただし、正しい設計は実際に何をしようとしているかによって異なることに注意してください。これはあなたの質問からは明らかではありません。

コードに関するその他のコメント:

  • use strict;コードでベストプラクティスを使用できるように常に支援します。
  • 字句変数を宣言する正しい方法は、ではありmy $gg;ませんlocal $gg;local実際には字句変数を作成しません。ローカライズされた値をグローバル変数に与えます。頻繁に使用する必要はありません。
  • サブルーチンにシステム関数と同じ名前を付けることは避けてください(例print)。これは紛らわしいです。
  • サブルーチンを呼び出す前に使用することはお勧めしません&(あなたの場合、システム関数名との競合のために必要でしたが、私が言ったように、それは避けるべきです)。
于 2013-03-15T10:31:13.323 に答える