2010-06-01 60 views
1

我正在運行試圖在perl中一次運行兩個子例程。我能做的最好的方式是什麼?例如:Perl運行同步例程

sub 1{ 
     print "im running"; 
    } 

sub 2{ 
     print "o hey im running too"; 
    } 

如何一次執行兩個例程?

回答

7

使用threads

use strict; 
use warnings; 
use threads; 

sub first { 

    my $counter = shift; 
    print "I'm running\n" while $counter--; 
    return; 
} 

sub second { 

    my $counter = shift; 
    print "And I'm running too!\n" while $counter--; 
    return; 
} 

my $firstThread = threads->create(\&first,15); # Prints "I'm running" 15 times 
my $secondThread = threads->create(\&second,15); # Prints "And I'm running too!" 
               # ... 15 times also 

$_->join() foreach ($firstThread, $secondThread); # Cleans up thread upon exit 

你應該注意的是印刷是如何不規則地交錯的。不要試圖在假設執行順序良好的前提下進行任何計算。

Perl的線程可以互相通信使用:

  • 共享變量(use threads::shared;
  • 隊列(use Thread::Queue;
  • 信號量(use Thread::Semaphore;

參見perlthrtut以獲取更多信息和優異的教程。

+1

查看[這篇文章](http://stackoverflow.com/questions/2423353/can-we-run-two-simultaneous-non-nested-loops-in-perl)的相關問題。 – Zaid 2010-06-01 13:36:56

+0

感謝大家。欣賞它 – jtime08 2010-06-01 13:41:00

0

我居然沒意識到,Perl可以做到這一點,但你需要的是支持多線程:

http://search.cpan.org/perldoc?threads

要麼,叉兩個過程,但是這將是一個有點難以隔離子例程的調用。

+0

這裏有一個稍微容易追隨的鏈接:http://perldoc.perl.org/perlthrtut.html#Thread-Basics – d11wtq 2010-06-01 13:16:26

+0

謝謝,我將看看它 – jtime08 2010-06-01 13:22:38

+3

d11wtq,請編輯您的答案:'線程'模塊(大寫字母T)甚至不再工作,已經被'threads'模塊所取代。 – daxim 2010-06-01 15:07:12