如果我通过SSH远程运行以下简单的Perl脚本,我将无法理解其行为。
use strict;
use warnings;
use threads;
use threads::shared;
use POSIX;
my $print_mutex : shared;
################################################################################
sub _print($)
{
my $str = shift;
lock($print_mutex);
my $id = threads->tid();
my $time = strftime('%H:%M:%S', localtime time);
print "$time [$id] $str";
return;
}
################################################################################
sub run()
{
for my $i (1 .. 3)
{
_print("Begin $i\n");
sleep 1;
_print("End $i\n");
}
return threads->tid();
}
################################################################################
_print "Starting test.\n";
my @threads;
for my $thr_num (1 .. 2)
{
my $thr = threads->create('run');
push @threads, $thr;
_print "Thread created.\n";
}
foreach (@threads)
{
my $id = $_->join;
_print "Thread '$id' finished.\n";
}
_print "Test finished.\n";
################################################################################
当我在装有Perl-5.10.0的Linux机器上正常运行它时,我得到了预期的结果:
$ perl /tmp/a.pl
14:25:54 [0]开始测试。
14:25:54 [0]线程已创建。
14:25:54 [1]开始1
14:25:54 [0]线程已创建。
14:25:54 [2]开始1
14:25:55 [1]结束1
14:25:55 [1]开始2
14:25:55 [2]结束1
14:25:55 [2]开始2
14:25:56 [1]结束2
14:25:56 [1]开始3
14:25:56 [2]结束2
14:25:56 [2]开始3
14:25:57 [1]结束3
14:25:57 [0]线程'1'完成。
14:25:57 [2]结束3
14:25:57 [0]线程'2'完成。
14:25:57 [0]测试完成。
$
但是,当我通过SSH(在同一本地主机上,但没关系)运行它时,会得到非常奇怪的结果(仔细查看时间戳和线程ID):
$ ssh localhost'perl /tmp/a.pl'
14:26:11 [0]开始测试。
14:26:11 [0]线程已创建。
14:26:11 [1]开始1
14:26:12 [1]结束1
14:26:12 [1]开始2
14:26:13 [1]结束2
14:26:13 [1]开始3
14:26:14 [1]结束3
14:26:11 [2]开始1
14:26:12 [2]结束1
14:26:12 [2]开始2
14:26:13 [2]结束2
14:26:13 [2]开始3
14:26:14 [2]结束3
14:26:11 [0]线程已创建。
14:26:14 [0]线程'1'完成。
14:26:14 [0]线程'2'完成。
14:26:14 [0]测试完成。
$
我从未在单线程Perl脚本中看到过这种情况,我注意到在创建第一个线程之后,我就开始看到I / O问题。
我能够在Windows上使用最新的Perl-5.12来重现该问题,所以我认为该问题不是Perl / OS所特有的。
有人可以解释这是怎么回事吗?
最佳答案
我自己能够重现这一点。但是,当通过ssh从shell运行它时,我得到了预期的行为。那有什么区别呢?伪终端!
试试这个:
ssh -t localhost 'perl /tmp/a.pl'
关于multithreading - 在Linux上通过SSH运行多线程Perl脚本的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5868309/