gpt4 book ai didi

multithreading - 使用STDOUT(屏幕)与常规文件的性能

转载 作者:行者123 更新时间:2023-12-04 23:15:55 29 4
gpt4 key购买 nike

我一直在做一些研究,发现了这种情况。如果要写入STDOUT(屏幕),将无法执行多线程脚本,该脚本通过简单的单线程脚本可以更快地打印数据。但是,如果您写入这样的文件:

myPrinter.perl > myPrint

结果发生了变化,您可以看到多线程方法获得了更好的时间。我的疑问是,由于STDOUT(屏幕)或输出文件都是共享资源,访问时间是否会相似? 为什么多线程方法只能对文件进行更好的写入?

我在实验中使用的perl脚本是:

单线
for my $i  (1..100000000){
print("things\n");
}

多线程
use threads;
use Thread::Queue 3.01 qw( );

use constant NUM_WORKERS => 4;


sub worker {
for my $i (1 .. 25000000){
print("things\n");
}
}

my $q = Thread::Queue->new(); #::any

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

for my $i (1 .. 4){
$q->enqueue($i);
}

$q->end();
$_->join for threads->list;

鸣谢:队列实现来自 ikegami答案之一。

最佳答案

如果写入STDOUT需要内部某种形式的锁定,则可以对此进行解释。

当STDOUT连接到端子时,每换行后都会刷新输出。否则,仅每4 KiB或8 KiB刷新STDOUT(取决于Perl的版本)。后一种情况大概需要更少或更短的锁。

您可以使用|cat而不是>file来获得相同的效果。

如果您的实际工作人员花费很少的时间写STDOUT,则该问题将消失。

关于multithreading - 使用STDOUT(屏幕)与常规文件的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42405829/

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