gpt4 book ai didi

multithreading - Perl多线程未运行批处理命令

转载 作者:行者123 更新时间:2023-12-03 12:54:08 25 4
gpt4 key购买 nike

我正在尝试使用perl多线程来运行包含在类似于此的大文件中的每个cmd.exe命令:

copy file1.txt file2.txt
copy file3.txt file4.txt
...
copy file5000.txt file5001.txt

我查看了 this question的答案,并尝试了仅复制两个文件的示例测试。

问题在于该命令永远不会被调用。即使文件位于我运行perl脚本的同一文件夹中,也永远不会复制这些文件。

我究竟做错了什么?
use strict;
use warnings;
use threads;
use Thread::Queue;

print "Perl Starting ... \n\n";

my $q = Thread::Queue->new(); # A new empty queue

# Worker thread
my @thrs = threads->create(\&doOperation ) for 1..5;#for 5 threads

my @files = ("copy file123.xml test1.xml", "copy file123.xml test2.xml");
#add files to queue
foreach my $f (@files){
# Send work to the thread
$q->enqueue($f);
print "Pending items: ". $q->pending() ."\n";
}
$q->enqueue('_DONE_') for @thrs;
$_->join() for @thrs;



sub doOperation () {
my $ithread = threads->tid() ;
while (my $cmd = $q->dequeue()) {
# Do work on $item

print "cmd: $cmd ... \n";
print "Running Dos command ... \n";

my $status = system("$cmd");

print "Status: $status ... \n";
print "End Dos command ... \n";

return 1 if $cmd eq '_DONE_';
print "[id=$ithread]\t$cmd\n";
}
return 1;
}


print "\nPerl End ... \n\n";

…这是 cmd.exe的输出
Perl Starting ...

Pending items: 1
cmd: copy file123.xml test1.xml ...
Running Dos command ...
Pending items: 0
cmd: copy file123.xml test2.xml ...

Running Dos command ...
Perl End ...

Perl exited with active threads:
5 running and unjoined
0 finished and unjoined
0 running and detached

PS。我已经尝试过Parallel::ForkManager,并且在Windows服务器上进行X次处理后,它一直崩溃,这就是为什么我要寻找替代解决方案的原因。

最佳答案

以下声明导致@thrs的元素为零。

my @thrs = threads->create(\&doOperation ) for 1..5;#for 5 threads

然后,您在两个地方引用@thrs。如果您按照Mobrine的指示用 threads->list()替换所有这些引用(不仅是一个引用,而是两个),那么您将取得进展。

或者,您可以像这样修改声明:
my @thrs;
push @thrs, threads->create(\&doOperation ) for 1..5;

关于您对有关解决一个引用的问题的意见,该引用使副本可以发生,但脚本无法终止:您可能没有解决第二个引用,该引用使DONE排队,从而防止了每个线程的while循环中断。

在下面的评论中,并假设您需要保留自己的线程列表,ikegami显示了创建列表的更为简便的方法:
my @thrs = map { threads->create(\&doOperation ) } 1..5;

关于multithreading - Perl多线程未运行批处理命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54928545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com