2013-03-15 143 views
9

我需要知道如何爲以下代碼實現多線程。我需要每秒調用一次該腳本,但睡眠計時器在2秒後處理它。整個腳本在每3秒後調用一次。但是我需要每秒鐘撥打電話,任何人都可以爲我提供解決方案,或者指引我走向正確的方向。perl代碼的多線程

#!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); 
      } 
     } 

它只是一個例子。

回答

24

下面是使用線程的一個簡單的例子:

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; 
} 

這將創建一個線程每一秒。線程本身持續兩秒鐘。

要了解更多有關線程,請參見the documentation。一個重要的考慮是變量不在線程之間共享。當你開始一個新的線程時,所有變量的副本都會被複制。

如果需要共享變量,look into threads::shared

但是,請注意,正確的設計取決於你實際上是試圖做。你的問題不清楚。

在你的代碼的一些其他意見:

  • 始終use strict;,以幫助你在你的代碼中使用的最佳實踐。
  • 聲明一個詞法變量的正確方法是my $gg;而非local $gg;local實際上並沒有創建一個詞彙變量;它爲全局變量提供了一個本地化的值。這不是你需要經常使用的東西。
  • 避免給予子程序與系統功能同名(例如print)。這很混亂。
  • 不建議調用子程序之前,使用&(在你的情況下,它是必要的,因爲有一個系統函數名稱衝突的,但正如我所說,應避免)。
+0

很好的回答。要知道在多線程同時讀取和寫入相同的全局變量方面理解線程的好來源是什麼? – Myforwik 2013-03-15 10:43:59

+0

@Myforwik,請參閱答案的更新。變量不在線程之間共享。你需要爲此使用'threads :: shared'。我添加到答案中的兩個文檔鏈接應該有助於理解這一點。 – 2013-03-15 10:49:45

+0

謝謝,它會做... /// – NewBee 2013-03-15 10:53:01