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

workerman中,while(true)和timer::add的沖突?

bobshipwood

問題描述

以下的代碼,我寫在onworkerstart里面,每隔10秒中向redis的隊(duì)列寫數(shù)據(jù),但是為啥while(true)的部分沒有執(zhí)行呢?如果去掉while(true),那只能執(zhí)行1次,不能執(zhí)行多次?

    protected function loop()
    {
        Timer::add(10, function () {
            $data['DEVICE_ID'] = '567';
            $data['ADDRESS'] = '01';
            $data['MODEL_ID'] = "567";
            $data['OPERATE'] = "1";
            $data['DATA']['ONOFF'] = "1";
            $data['DATA']['TEMPERATURE'] = "20";
            $data['DATA']['MODEL'] = "0001";
            $data['DATA']['FAN'] = "0000";
            Redis::LPUSH(env('REDIS_AIRCONTROL_QUEUE'), json_encode($data));
        });
        while (true) {
            $data = Redis::RPOP(env('REDIS_AIRCONTROL_QUEUE'));
            if ($data) {
                $this->dealWith($data);
            }
        }
    }

為此你搜索到了哪些方案及不適用的原因

我在論壇上搜索了很多帖子,但是都沒有我這種情況

492 4 1
4個(gè)回答

jack10082009

while(1)是不是會(huì)導(dǎo)致阻塞,讓workerman框架拿不到控制權(quán)。

  • bobshipwood 2025-05-21

    很有可能。
    但是我的例子正好相反,是Timer::add部分執(zhí)行了,但是while(1)部分不執(zhí)行,所以這是為啥呢?

  • qqxxr 2025-05-21

    不是很有可能,就是的。這里的while等于把整個(gè)進(jìn)程死循環(huán)阻塞了。time里面的函數(shù)是執(zhí)行不成功的

  • qqxxr 2025-05-21

    你所謂的沒有執(zhí)行是指沒有Redis:PROP到數(shù)據(jù)的話,那就是滿足我剛才說的邏輯。因?yàn)閠imer沒有執(zhí)行,所以redis操作不到數(shù)據(jù)。你就可以試著在while里面echo 1;正常情況下是會(huì)一直輸出1

  • qqxxr 2025-05-21

    他是執(zhí)行了while,只是沒有PROP到數(shù)據(jù)讓你感到錯(cuò)覺是while沒有執(zhí)行。實(shí)際在while中echo 1;驗(yàn)證我說的

  • jack10082009 2025-05-22

    workerman框架開發(fā)就不應(yīng)該出現(xiàn)while(1),應(yīng)該以事件驅(qū)動(dòng),盡量使用回調(diào)。

  • bobshipwood 2025-05-28

    所以,只要有while(true),就會(huì)導(dǎo)致workerman拿不到控制器,導(dǎo)致Timer::add失效?

  • qqxxr 2025-05-28

    是的,只要有循環(huán)并且不中斷,后面的代碼全部失效

roczyl

你這是loop啊,執(zhí)行幾次?
onworkerstart 函數(shù)里寫的什么?

  • 暫無評(píng)論

你的代碼看起來似乎是redis的list數(shù)據(jù)進(jìn)出阻塞的問題。當(dāng)你有while(true)那塊代碼時(shí),redis阻塞在rpop方法哪里,去掉的時(shí)候阻塞在LPUSH。webman里是沒有可以使用你的靜態(tài)方法的Redis類的,所以分析你可能自己封裝了Redis Stream的阻塞模式的輕量隊(duì)列

  • 暫無評(píng)論
kyo

時(shí)鐘里的回調(diào)本質(zhì)上并不會(huì)開啟新線程執(zhí)行,同樣是在本進(jìn)程或線程執(zhí)行,想象一下:單線程有可能執(zhí)行while同時(shí)又執(zhí)行回調(diào)嗎
解決方案:1、將while改成異步,2、用時(shí)鐘代替while,將間隔設(shè)為0(當(dāng)然不建議)

  • bobshipwood 2025-05-28

    你的意思是timer::add函數(shù)本質(zhì)上是workerman注冊(cè)了一個(gè)回調(diào)函數(shù)?

  • kyo 2025-05-30

    @bobshipwood 當(dāng)然,但凡研究過源碼都大概知道,另外,有用過.net,java,delphi的timer也應(yīng)該知道原理是一樣的,因?yàn)閠imer的功能很單一,只是用來計(jì)時(shí)并不是多線程技術(shù)

  • bobshipwood 23天前

    好的,學(xué)習(xí)了,謝謝

??