国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

請(qǐng)問在PHP或者webman中這類的耗時(shí)操作,如何優(yōu)化?

aaoott

問題描述

我有5個(gè)for循環(huán)

for(...){
sleep(3)// 耗時(shí)結(jié)果
}
for(...){
sleep(5)// 耗時(shí)結(jié)果
}
for(...){
sleep(6)// 耗時(shí)結(jié)果
}
for(...){
sleep(7) // 耗時(shí)結(jié)果
}
for(...){
sleep(10) // 耗時(shí)結(jié)果
}

在c#中,我只需要開5個(gè)線程,然后等待全部完成,返回結(jié)果。總耗時(shí)10秒。
$result = waitAll();

// 需要返回上面的計(jì)算結(jié)果給response ,所以不能用隊(duì)列之類的。

剛剛webman執(zhí)行效率和開發(fā)效率不是一般的快,真是太NB了!!但是在PHP或者webman有什么好的方式能處理這類的需求嗎?核心訴求是有沒有辦法能并發(fā)執(zhí)行for,然后等待全部執(zhí)行完畢,返回結(jié)果。

1263 5 3
5個(gè)回答

胡桃
  • config/server.php
// ...
return [
    // ...
    'event_loop' => \Workerman\Events\Swoole::class,
    // ...
];

  • app/controller/Controller.php
<?php
declare(strict_types=1);

namespace app\controller;

use co;
use support\Request;

class Controller
{
    public function action(Request $request)
    {
        $cid_group[] = go(fn() => co::sleep(3));
        $cid_group[] = go(fn() => co::sleep(5));
        $cid_group[] = go(fn() => co::sleep(6));
        $cid_group[] = go(fn() => co::sleep(7));
        $cid_group[] = go(fn() => co::sleep(10));
        co::join($cid_group);
        // ...
    }
}
TM

可以放入隊(duì)列里面然后等待完成后執(zhí)行下面的業(yè)務(wù)?或者上swoole擴(kuò)展開攜程?

  • aaoott 2023-12-11

    隊(duì)列可以等待嗎?

  • TM 2023-12-11

    可以呀 也可以延遲隊(duì)列

小W

多進(jìn)程+channel

  • aaoott 2023-12-11

    我剛剛?cè)タ戳艘槐槲臋n。還是不理解怎么弄

Mr_Deng

c#也來搞php了嗎

  • 暫無評(píng)論
meows

C# 里面開多線程去做,php單線程就能完成這種并發(fā)請(qǐng)求。


  1. 安裝swoole、openswoole擴(kuò)展隨便選擇一個(gè),具體用法:https://wiki.swoole.com/#/coroutine/wait_group?id=coroutinewaitgroup

    config/server.php
    // ...
    return [
    // ...
    'event_loop' => \Workerman\Events\Swoole::class,
    // ...
    ];
    /**
    也可以看看swoole 框架有沒有好用的http-client工具庫,這是其中一個(gè):https://hyperf.wiki/3.1/#/zh-cn/guzzle (我沒在workerman環(huán)境使用過,你自己親測(cè)下)
    */
  2. 什么擴(kuò)展都不安裝,選擇php.net的方式

// 初始化 cURL
$ch1 = curl_init('http://www.example.com/');
$ch2 = curl_init('http://www.example.org/');

// 創(chuàng)建 cURL 多個(gè)批處理句柄
$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

$active = null;

// 執(zhí)行批處理
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

// 等待活動(dòng)連接,直到有活動(dòng)連接或超時(shí)
if ($mrc == CURLM_OK) {
    if (curl_multi_select($mh) == -1) {
        usleep(1);
    }
}

// 循環(huán)直到?jīng)]有活動(dòng)連接
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($active > 0);

// 關(guān)閉所有句柄
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

3.選擇guzzle/http庫異步并發(fā)庫,請(qǐng)查看 https://github.com/guzzle/guzzle (自行查詢用法)

  • aaoott 2023-12-11

    謝謝!就是要這樣的,我研究看看。不過我耗時(shí)并不是請(qǐng)求URL,如果不是IO密集型,是計(jì)算密集型的,單線程協(xié)程也能起到加速效果嗎?

  • meows 2023-12-11

    協(xié)程主要是處理IO密集型,對(duì)于計(jì)算密集型還會(huì)降低些性能。(畢竟協(xié)程調(diào)度也是有開銷的)

年代過于久遠(yuǎn),無法發(fā)表回答
??