multithreading - 在Linux上通过SSH运行多线程Perl脚本的问题

标签 multithreading perl ssh io

如果我通过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/

相关文章:

Java并发生成无限数量的对象

html - 如何使用 CSS 或 Multimarkdown 在新选项卡中打开超链接?

ruby-on-rails - 由于 key 类型不受支持,无法将 Rails 应用部署到 DigitalOcean

linux - 如何授予 ssh 隧道访问权限以访问 svn 但不访问 shell

SSH 卡在 client_input_global_request : rtype hostkeys-00@openssh. com want_reply 0

ios - NSURLConnection 和 beginBackgroundTaskWithExpirationHandler

java - 每次在目录Java中搜索时如何创建新线程

c++ - 在 Windows 上以编程方式获取硬件线程数的可靠方法

perl - 为什么在这种情况下 Perl 会自动激活?

perl - 如何确定使用Perl将计算机设置为当前时区?