Как работает параллель Am php? - PullRequest
2 голосов
/ 12 января 2020

Я читал о am php, и у меня возникли сомнения по поводу параллельного

Пример кода:

<?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));

Этот код выполняет весь curl или ожидает выполнения 1 другой

Ответы [ 2 ]

2 голосов
/ 12 января 2020

Это использует функциональность curl_multi. Он не работает параллельно обычным способом, о котором вы думаете. Он работает путем опроса обратного вызова для curl, а затем возврата, когда заданное вами обещание c выполнено. Все другие обещания, которые разрешаются во время процесса опроса, завершаются и кэшируются в соответствующем обещании, ожидая, пока вы не позвоните, ожидайте. Библиотека curl - это то, что открывает несколько сокетов и обрабатывает параллелизм для вас.

Если вы хотите базовый пример того, как это работает, я поместил пример проекта на github, который состоит из 2 классов. https://github.com/kwhat/requestful

первые 7 методов - это все, что требуется для настройки интерфейса обещания. Все маги c здесь основаны на двух обратных вызовах, переданных конструктору, а также обертках вокруг обратных вызовов then / cancel.

Метод sendRequestAsyn c параллельные запросы curl созданы. Волшебство c все происходит в обратном вызове для wait () для любого обещания, которое вызывает анонимную функцию , которая intern вызывает метод tick в al oop. Этот метод tick () разрешает все обещания, независимо от того, какой вызов вызывается.

0 голосов
/ 18 января 2020

Как вы можете видеть из Amp codebase , он будет выполнять все ваши запросы внутри одного и того же события l oop.

Учитывая, что ваши запросы получаются (yield $client->request($url)), и они выдаются внутри одного и того же события l oop, они отправляются одновременно.

Я рекомендую вам прочитать эту статью через , особенно разработку "Asyn c: как Усилитель рамных работ ». Я думаю, это немного прояснит, как движок работает за кулисами.

Надеюсь, это было полезно. Ура! :)

...