Amphp 并行是如何工作的?

How the Amphp parallel works?

我正在阅读有关 amphp 的内容,我对并行有疑问

示例代码:

<?php

require __DIR__ . '/vendor/autoload.php';

$client = new Amp\Artax\DefaultClient;
$promises = [];

$urls = [
    "http://google.com.br",
    "http://facebook.com.br",
    "http://xat.com/",
    "http://kobra.ninja/",
    "http://wikipedia.com",
    "http://manualdomundo.com.br",
    "http://globo.com",
    "http://gmail.com"
];

foreach ($urls as $url) {
    $promises[$url] = Amp\call(function () use ($client, $url) {
        // "yield" inside a coroutine awaits the resolution of the promise
        // returned from Client::request(). The generator is then continued.
        $response = yield $client->request($url);

        // Same for the body here. Yielding an Amp\ByteStream\Message
        // buffers the entire message.
        $body = yield $response->getBody();
        echo $url;
        return $url;
    });
}

$responses = Amp\Promise\wait(Amp\Promise\all($promises));

这段代码 运行 是全部卷曲,还是等待 1 执行另一个?

这正在使用 stream_select 功能。不是你想的常规方式运行并行。它通过注册一个回调来工作,一旦流可读/可写,然后在您等待的特定承诺完成时返回。同时解决的所有其他承诺都已完成并缓存在各自的承诺中,等待您使用 yieldPromise::onResolve 解包值。 Amp's event loop 是管理多个套接字并为您处理并发的东西。

如果您想了解其工作原理的基本示例,我在 GitHub 上放了一个示例项目,它是两个 类,但基于 Curl 而不是 stream_selecthttps://github.com/kwhat/requestful

first 7 methods 是设置 promise 接口所需的全部。这里的所有魔法都基于传递给构造函数的两个回调以及 then/cancel 回调的包装器。

实习生循环调用tick方法的sendRequestAsync method is how the concurrent Curl requests are created. The magic all happens in the callback for wait() on any promise, which calls an anonymous functiontick() 方法是解决所有承诺的方法,无论您调用哪个承诺。

正如您从 Amp codebase 中看到的那样,它将 运行 您在同一事件循环中的所有请求。

鉴于您的请求正在生成 (yield $client->request($url)),并且它们是在同一事件循环中生成的,因此它们是同时调度的。

我建议您阅读 this article through,特别是 "Async development: how Amp framework works" 部分。我认为这将使引擎在幕后的工作方式更加清晰。

希望这对您有所帮助。干杯! :)