1

我正在使用 amphp/parallel-functions并行for loops运行两个。我想知道如何查看并行打印的实时输出?我正在考虑打印到两个不同的终端。有可能吗?如果不是,我如何跟踪并行或顺序运行的输出?

<?php
require "vendor/autoload.php";

use Amp\Promise;
use Amp\ParallelFunctions;

$promises[1] = ParallelFunctions\parallel(function (){

    for ($i=0; $i<50; $i++){
        echo 'Promise-1 : '. $i . PHP_EOL;
    }

})();

$promises[2] = ParallelFunctions\parallel(function (){

    for ($i=0; $i<50; $i++){
        echo 'Promise-2 : '. $i .PHP_EOL;
    }

})();

Promise\wait(Promise\all($promises));

当前输出似乎是连续的

Promise-1 : 0
Promise-1 : 1
Promise-1 : 2
Promise-1 : 3
Promise-1 : 4
Promise-2 : 0
Promise-2 : 1
Promise-2 : 2
Promise-2 : 3
Promise-2 : 4

注意我使用的是mac,这纯粹是为了在我的本地测试。

4

2 回答 2

1

免责声明:打印到终端本质上将非常依赖于操作系统,而不是一个非常稳定的系统:当用户关闭终端时你会做什么?如果您在第一个终端上已经运行了其他东西会发生什么?

有了这个,你可以这样做:

在大多数版本的 linux 上,您可以写入位于 /dev/pts/(例如 /dev/pts/1)的虚拟文件以在任何打开的终端上输出。您可以通过打开两个终端实例并在第二个终端实例中键入以下内容来尝试一下:

echo "testing" > /dev/pts/0

这应该在第一个终端上打印测试。但是它在 mac 上不起作用,因为没有 /dev/pts 文件夹,但是您可以在第二个终端中键入以下内容:

echo "testing" > /dev/ttys000

或在 php 中:

$fp = fopen('dev/ttys000');
fwrite($fp, "testing\n");
fclose($fp);

如果在 Windows 上完全可行,那几乎肯定比写入文件要复杂得多。

一般来说,我建议在这种情况下将输出写入单独的日志文件,而不是终端

于 2020-04-21T14:06:17.147 回答
0

amphp/parallel使用子进程并行运行这些。子进程的 STDOUT 和 STDERR 分别通过管道传输到父进程的 STDOUT 和 STDERR。由于流是按块读取和写入的,因此输出顺序可能并不代表实际的执行顺序。

如果您将sleep调用放入for循环中,您可能能够观察到交错的执行顺序。

于 2020-04-27T19:16:43.990 回答