0

我正在使用 perl 脚本来执行一个脚本,该脚本应该同时执行 10 个不同的进程。我的要求是: 1. 它将首先从文本文件中提取每一行(每行有 10 行,每行一个单词) 2. 使用这一行为所有这些名称执行一个脚本 app.exe。3. 执行每个应该同时执行的线程。

为了实现这一点,我在下面编写了一段代码。但是我可以在任务管理器中看到一次只有一个进程正在运行。但我需要所有 10 个进程应该同时运行。谁能帮我解决这个问题?

use Thread; 
$file='input.txt'; 
open(INFO, $file) or die("Could not open file."); 
$count = 0; 
foreach $line (<INFO>) { $huh = Thread->new(\&thread1); 
print "Waiting for thread now\n"; 
$stuff = $huh->join(); 
sub thread1 { print "$line"; 
'QueryStores.exe "UPDATE OPTIONS_STR SET OPT_VALUE = 0 WHERE OPT_ID = 16005" /S:$line'    
return 1;} } close(INFO);
4

2 回答 2

4
  1. 您正在创建线程,而不是进程。
  2. 线程不会显示在任务管理器中,因此我不确定您如何设法使用任务管理器来确定一次只运行一个。
  3. ->join您是正确的,您创建的线程一次只运行一个,因为您在创建另一个线程之前等待刚刚创建的线程结束 ( )。

use threads;
use Thread::Queue 1.03 qw( );

use constant NUM_WORKERS => 10;

sub worker {
   my ($job) = @_;
   system('QueryStores "UPDATE OPTIONS_STR SET OPT_VALUE = 0 WHERE OPT_ID = 16005" /S:'.$job);
   if    ($? == -1)  { warn("Can't start child $job: $!\n"); } 
   elsif ($? >> 8)   { warn("Child $job returned error ".($? >> 8)."\n"); } 
   elsif ($? & 0x7F) { warn("Child $job killed by signal ".($? & 0x7F)."\n"); } 
}

my $q = Thread::Queue->new();
for (1..NUM_WORKERS) {
    async {
        while (defined(my $job = $q->dequeue())) {
           worker($job);
        }
    };
}

while (<>) {
   chomp;
   $q->enqueue($_);
}

$q->end();
$_->join() for threads->list();
于 2013-08-07T18:19:19.193 回答
0

我尝试阅读您的代码,问题似乎是您的线程在下一个循环迭代之前等待加入(阻塞)。任务管理器不显示线程(仅进程)。尝试Process Explorer查看线程(我没有亲自使用过,但看起来它可以完成这项工作)

你的代码应该是这样的

#!/bin/perl 

use warnings;
use strict;

use Thread;

my @list = qw(abc1 abc2 abc3 abc4 abc5);
my @threadlist = ();

for my $lst (@list) {
  my $t = Thread->new(\&thread_exec , $lst);
  print "Wating for thread for $lst\n";
  push @threadlist, $t;
}

for my $thd (@threadlist) {
  print "Wating for thread to join\n";
  $thd->join;
}

sub thread_exec {
  my $info = shift;
  print "INFO = $info\n";
}

输出类似这样的内容[您可以看到线程正在并行运行]

$~/Documents/dummy.pl 
Wating for thread for abc1
Wating for thread for abc2
Wating for thread for abc3
Wating for thread for abc4
Wating for thread for abc5
Wating for thread to join
INFO = abc2
INFO = abc5
INFO = abc1
Wating for thread to join
Wating for thread to join
INFO = abc4
INFO = abc3
Wating for thread to join
Wating for thread to join

另一方面 - 将 join 放在同一个 for 循环中(就像你所做的那样会产生这样的线程的序列化执行)

$~/Documents/dummy.pl 
Wating for thread for abc1
INFO = abc1
Wating for thread for abc2
INFO = abc2
Wating for thread for abc3
INFO = abc3
Wating for thread for abc4
INFO = abc4
Wating for thread for abc5
INFO = abc5
于 2013-08-07T18:34:29.617 回答