gpt4 book ai didi

multithreading - 为Perl中的特定线程重定向STDOUT

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

我有一个Perl脚本,该脚本具有3个线程,并使用共享队列来拉作业。
我每个线程都有一个日志文件。

我想做的是覆盖此线程的STDOUT,以便此线程内的所有操作都打印到日志文件,而不是终端。

当我启动每个线程时,有这个

open ( STDOUT, '>>', 'log'.$tid.'.txt' );

不幸的是,这会覆盖所有线程的STDOUT,所以我的所有内容都在log3.txt中。

我如何才能仅将STDOUT覆盖/重定向到当前线程?

编辑:
我确实尝试了SELECT和本地* STDOUT,但我的问题是,每个线程都调用一个.exe,我希望它输出到修改后的STDOUT,而SELECT和LOCAL不会发生。

最佳答案

STDOUT是一个Perl变量,作为Perl变量,它是特定于线程的。您绝对可以在不影响任何其他线程的情况下更改STDOUT

$ cat a.pl
use threads;

for (1..3) {
async {
my $tid = threads->tid;
open(local *STDOUT, '>', "out.$tid.txt") or die $!;
sleep(1);
print("$_\n");
};
}

$_->join for threads->list;

$ perl a.pl

$ grep '.*' *.txt
out.1.txt:1
out.2.txt:2
out.3.txt:3

但这与您的问题无关。您想要将创建的子项的stdout与文件句柄相关联。这与父代中的Perl变量无关,并且不受线程影响。
use IPC::Run3 qw( run3 );

my $tid = threads->tid;

run3([ 'printf', '%s\n', $tid ], \undef, "out.$tid.txt");

或者
use IPC::Run qw( run );

my $tid = threads->tid;

run([ 'printf', '%s\n', $tid ], \undef, "out.$tid.txt");

或者
use IPC::Open3 qw( open3 );

my $tid = threads->tid;

open(local *CHILD_STDIN, '<', '/dev/null') or die $!;
open(local *CHILD_STDOUT, '>', "out.$tid.txt") or die $!;
my $pid = open3('<&CHILD_STDIN', '>&CHILD_STDOUT', '>&STDERR',
'printf', '%s\n', $tid);
waitpid($pid, 0);

(我建议不要使用IPC::Open3。对于大多数事情来说,它太低级了。对于这个简单的任务来说,它甚至相对复杂。我只包括了它,因为它与Perl bundle 在一起。)

关于multithreading - 为Perl中的特定线程重定向STDOUT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41427648/

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