【发布时间】:2017-07-13 08:22:16
【问题描述】:
我一直在做一些研究,我得到了这种情况。如果您想写入 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 答案之一。
【问题讨论】:
-
你所说的“to the STDOUT”是什么意思......实际上让它在屏幕上显示出来?这将需要更长的时间,所有的渲染、重绘等等。计时单线程,以筛选与重定向。我不知道它如何影响多线程,但我的猜测是它只会更糟。此外,正如 ThisSuitIsBlackNot 所说,缓冲可能会有所不同。
标签: multithreading performance perl stdout file-handling