初探swoole協(xié)程

正在學(xué)習(xí)swoole的協(xié)程中,協(xié)程的特點是看起來象是并發(fā)執(zhí)行。試驗一下。

初探swoole協(xié)程

推薦免費:swoole

本文前提,linux上已安裝了swoole。目前的最新版是 4.5.9(2020-12-17)

構(gòu)造一個需求,一下創(chuàng)建5個協(xié)程,每個協(xié)程休眠1到3秒之間的隨機數(shù),然后打印出睡眠時間,希望所有的程序結(jié)束時,整個耗時是最長3秒。

1.php

foreach?(range(1,?5)?as?$v)?{ ????go(function?()?{ ????????$sleep_time?=?random_int(1,?3); ????????sleep($sleep_time); ????????echo?"睡眠了"?.?$sleep_time?.?"秒n"; ????});}

用php 1.php執(zhí)行,程序能執(zhí)行,但是感覺不像是協(xié)程,而是同步執(zhí)行的。整個執(zhí)行下來遠(yuǎn)遠(yuǎn)超過3秒。原來這里有個小bug,應(yīng)該使用 co:sleep, 這樣才會在本協(xié)程內(nèi)睡眠,而不影響整個程序。

2.php

foreach?(range(1,?5)?as?$v)?{ ????go(function?()?{ ????????$sleep_time?=?random_int(1,?3); ????????co::sleep($sleep_time); ????????echo?"睡眠了"?.?$sleep_time?.?"秒n"; ????});}

結(jié)果如下:

睡眠了1秒 睡眠了2秒 睡眠了2秒 睡眠了3秒 睡眠了3秒

總之一定是睡眠少的協(xié)程先退出,而且,睡眠了同樣時間的協(xié)程是同時打印出字符的。并且程序結(jié)束時的總共耗時就是3秒,說明并發(fā)成功。

現(xiàn)在希望5個協(xié)程結(jié)束后,能打印出hello world!

3.php

foreach?(range(1,?5)?as?$v)?{ ????go(function?()?{ ????????$sleep_time?=?random_int(1,?3); ????????co::sleep($sleep_time); ????????$a?=?random_int(1,?1000); ????????echo?"睡眠了"?.?$sleep_time?.?"秒n"; ????});}echo?"hello?world!n";

結(jié)果又出問題了,hello world 總是最先打印出來。
所以,這里需要使用協(xié)程容器這個東東。

4.php

Corun(function?()?{ ????foreach?(range(1,?5)?as?$v)?{ ????????go(function?()??{ ????????????$sleep_time?=?random_int(1,?3); ????????????co::sleep($sleep_time); ????????????echo?"睡眠了"?.?$sleep_time?.?"秒n"; ????????}); ????}});echo?"hello?world!n";

結(jié)果如下:

睡眠了1秒 睡眠了2秒 睡眠了3秒 睡眠了3秒 睡眠了3秒 hello?world!

這次就能打印出正確結(jié)果了,perfect!
swoole的協(xié)程還是有點意思的~

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊11 分享