Hyperf 协程求助

249 阅读1分钟

如题:

现在有一个命令行运行的程序,要循环执行请求接口,接口有分页。有的接口很快就结束了,有的还有好几十页。他们都在一个command中进行。

如果想要把这些分页多的,再多开协程并发请求分页。但是又不能超过最大的进程池限制,应该如何处理?

image.png

接口A、B、C 使用 Parallel 创建三个协程并行执行。

C接口由于请求页数太多,后续想要实现为并行请求分页。 比如开10个协程,1-10页同时请求。


如果假设A、B、C三个接口并行已经达到进程池上限,那么C是不能直接开启协程的。 需要等到 A、B执行完成后,再开启协程分页。

应该如何解决

-- 解决方案:

<?php
use Hyperf\Coroutine\Concurrent;

$concurrent = new Concurrent(10);

for ($i = 0; $i < 30; ++$i) {
    $concurrent->create(function () {
        $this->pagnation();
    });
}

function pagnation() {
    $concurrent = new Concurrent(10);

    $page = 100;
    for ($i = 0; $i < $page; ++$i) {
        sendReqest($url);
        ...
    }
}

是否可以采用上面这种方案:

使用 Concurrent 协程运行控制 hyperf.wiki/3.0/#/zh-cn…

设置最大的协程数量,分页全部设置为协程程序。 如果有的接口很快请求结束,会释放协程。那么其他的分页较多的程序,会自动占用空余的协程,然后达到最大的利用率。