【问题标题】:how to run a Perl thread in for loop如何在 for 循环中运行 Perl 线程
【发布时间】:2013-11-18 09:47:45
【问题描述】:

我有一个多线程的主 Perl 脚本。我想要做的是每个线程将运行 3 个命令,一旦整个线程完成,我希望我的脚本再次触发同一个线程,基本上是在一个循环中,谁能告诉我该怎么做

这是我的 perl 代码 sn-p

my @finalOneClickarray= grep(/\S/, @oneclickConcurrentbackup); #----Removing the empty content from the array---#   

#---Making Concurrent OneClick backup commands using threads------#
my @threads;

#-----performing the CHO loops as given by user-------#
foreach (@finalOneClickarray) {
    push @threads, threads->new(\&concurrentBackupCommandsRead, $_);
}

foreach (@threads) {
    $_->join();
}

concurrentBackupCommandsRead 是执行命令的方法。

更新的 perl 代码:--

use threads;
use threads::shared;
my @arr = (1,2,3,4);
my $outnumber :shared =4;


print "\n variable outside thread that is in main program $outnumber\n";
my @threads;


for($i=0;$i<=3; $i++)
{
  print "\ncalling subrountine vinay for $i times\n";

  vinay();

}

sub vinay()
{
    foreach (@arr) {
       push @threads, threads->create(\&doSomething);
    }
    foreach (@threads) {
       $_->join();
    }
}

sub doSomething ()
{

 print "\n Before increment is $outnumber\n";
 my $foo = $outnumber; 
 $outnumber = $foo + 1;

print "\n After increment is $outnumber\n";

}

【问题讨论】:

  • 您是否尝试在固定数量的线程之间分配工作负载?如果是这样,请使用 Thread::Queue 将任务传递给工作人员。
  • 没有每个线程将执行子程序并返回到主 perl 脚本,现在它已经返回到主脚本,我想再次触发相同的命令集,所以这必须继续循环,所以想问一下如何将上面的代码放入循环中,如果有什么办法请告诉我
  • @VinayD,不清楚你在问什么。鉴于您的评论,您为什么不能简单地将上面的代码放在一个子例程中并在循环中调用 that ?向我们展示您尝试了什么以及为什么/在哪里不起作用。
  • 我也这样做了,但是我收到以下消息 Perl exited with active threads: 话虽如此,我的任务很简单,一旦创建并加入了上述线程,它们就会分开并执行回来,一旦他们回来,我需要一次又一次地做同样的工作,所以我希望这发生在 for 或 while 循环中,当我尝试 for 循环时,它给出了上述消息
  • @pilcrow,我已经粘贴了我的示例代码,请让我知道我在这里做错了什么......

标签: perl


【解决方案1】:

在第二次循环中,您尝试加入一个已经加入的线程(因为您只添加到@threads)。这会引发错误,“线程已加入”。

清除@threads,或将其本地化为vinay(),例如。

sub vinay()
{
    my @threads;
    foreach (@arr) {
       push @threads, threads->create(\&doSomething);
    }
    foreach (@threads) {
       $_->join();
    }
}

【讨论】:

  • 感谢您的回复,在这种情况下,我有一个问题,第二次产生的线程将在那里启动进程,只有在第一个循环中产生的线程完成或甚至在他们完成之前它就已经产生了。
  • 我不确定我是否理解您的问题。如果您询问第二组线程是否会在第一组完成后运行,答案是肯定的。 (因为您的代码通过等待它们返回来强制执行该行为)
  • 哦,好吧,这就是我要问的,我希望我的第一组线程完成,然后只生成第二组线程,非常感谢您的帮助..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
相关资源
最近更新 更多