我正在使用amphp/并行函数在并行中运行两个。我想知道如何才能看到实时输出并行打印?我正在考虑用两个不同的终端打印。这有可能吗?如果没有,我如何跟踪输出,如果它是平行或顺序运行?
<?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 : 4Note我使用的是mac,这纯粹是为了在本地进行测试。
发布于 2020-04-21 14:06:17
免责声明:到终端的打印本质上将非常依赖于操作系统,而不是一个非常稳定的系统:当用户关闭终端时,您会做什么?如果您已经在第一个终端上运行了其他东西,会发生什么情况?
在这里,你可以这样做:
在大多数版本的linux上,您可以将虚拟文件写入/dev/ at /(例如/dev/at/1),以便在任何开放终端上输出。您可以通过打开两个终端实例并在第二个实例中键入以下内容来尝试它:
echo "testing" > /dev/pts/0这应该在第一个终端上打印测试。但是,它不能在mac上工作,因为没有/dev/pt文件夹,但是您可以在第二个终端中键入以下内容:
echo "testing" > /dev/ttys000或在php中:
$fp = fopen('dev/ttys000');
fwrite($fp, "testing\n");
fclose($fp);如果这在Windows上是可能的话,那么它几乎肯定比写入文件要复杂得多。
通常,我建议在这种情况下将输出写入单独的日志文件,而不是终端。
发布于 2020-04-27 19:16:43
amphp/parallel使用子进程并行运行这些进程。子进程的STDOUT和STDERR分别通过管道传输到父进程的STDOUT和STDERR。由于流是以块形式读取和写入的,输出顺序很可能不代表实际的执行顺序。
如果将sleep调用放入for循环中,则很可能能够观察交错执行顺序。
https://stackoverflow.com/questions/61344804
复制相似问题