Chinaunix

标题: [求助] Perl如何实现子程序的并发执行 [打印本页]

作者: perhapszj5566    时间: 2014-07-22 10:09
标题: [求助] Perl如何实现子程序的并发执行
如题,我有一个子程序需要执行100次,如果顺序执行的话,太费时间。

如果实现并发调用这个子程序,让这100次同时进行?

多谢
作者: q1208c    时间: 2014-07-22 12:42
threads ?
作者: 珞水的大叔    时间: 2014-07-22 13:53
fork应该也可以
作者: oracle狂热分子    时间: 2014-07-22 21:29
使用多线程
作者: shijiang1130    时间: 2014-07-22 21:35
perhapszj5566 发表于 2014-07-22 10:09
如题,我有一个子程序需要执行100次,如果顺序执行的话,太费时间。

如果实现并发调用这个子程序,让这1 ...
能贡献一下你的子程序? 也许大家可以改成并发版的
作者: stanley_tam    时间: 2014-07-23 09:46
use Coro;{:3_193:}
作者: perhapszj5566    时间: 2014-07-23 14:19
shijiang1130 发表于 2014-07-22 21:35
能贡献一下你的子程序? 也许大家可以改成并发版的




#!/usr/bin/perl

$sum1 = &sum(1,10000000000);
$sum2 = &sum(1,100);

sub sum {
        my($start,$end) = @_;
        $x = 0;
        for(my $i=$start;$i<=$end;$i++){
                    $x = $x + $i;
        }
        return $x;
}

print "$sum1\n";
print "$sum2\n";

比如这个程序,如果按照目前这种执行顺序 , 需要等到$sum1计算完毕,才会计算$sum2 ,但是实际上$sum2所需要的计算时间远远的比$sum1低。

如果并发执行,$sum2应该比$sum1先执行完成。
作者: stanley_tam    时间: 2014-07-23 14:37
try this ?
  1. sub sum {
  2.     my($start,$end) = @_;
  3.     $x = 0;
  4.     for(my $i=$start;$i<=$end;$i++){
  5.         $x = $x + $i;
  6.     }
  7.     return $x;
  8. }

  9. $sum = fork ? sum 1, 1000000 : sum 1, 1000;
  10. print "$sum\n";
复制代码
回复 7# perhapszj5566


   
作者: yybmsrs    时间: 2014-07-23 14:46
fork能得到返回值?
作者: perhapszj5566    时间: 2014-07-23 14:58
回复 8# stanley_tam

非常感谢,大概就是这个意思。

如果我要调用100次&sum呢?fork该怎么用?

   
作者: shijiang1130    时间: 2014-07-23 15:25
stanley_tam 发表于 2014-07-23 14:37
try this ?回复 7# perhapszj5566
  1. use threads;
  2. #$sum1 = &sum(1,10000000000);
  3. #$sum2 = &sum(1,100);

  4. my $thr = threads->create('sum', (1,100000));
  5. my $thr2 = threads->create('sum', (1,200003));
  6. my $r1=$thr->join();
  7. my $r2=$thr2->join();
  8. print $r1 . '<=>' .$r2;

  9. sub sum {
  10.         my($start,$end) = @_;
  11.         $x = 0;
  12.         for(my $i=$start;$i<=$end;$i++){
  13.                     $x = $x + $i;
  14.                                         sleep 1;
  15.                                         print "current value is: $x\n"
  16.         }

  17.         return $x;
  18. }
复制代码

作者: shijiang1130    时间: 2014-07-23 15:27
perhapszj5566 发表于 2014-07-23 14:58
回复 8# stanley_tam

非常感谢,大概就是这个意思。

如果真的需求这么简单,可以用Erlang试试。全是并发
作者: perhapszj5566    时间: 2014-07-23 15:37
回复 11# shijiang1130

非常感谢,这个效果很明显的。
   
作者: perhapszj5566    时间: 2014-07-23 15:49
回复 12# shijiang1130


另外问一下, perl对线程个数有限制么?最多可以启动多少个线程? 成百上千个子线程有问题么?

   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2