2013-03-15 137 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