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

GatewayWorker 在多進(jìn)程下怎么創(chuàng)建唯一的全局定時(shí)器?

ximengxuan

如何設(shè)置全局唯一的定時(shí)器

由于GatewayWorker/Applications/YourApp/start_businessworker.php里設(shè)置的進(jìn)程數(shù)量是4

$worker->count = 4;

Events.php文件的onWorkerStart事件里設(shè)置了一個(gè)定時(shí)器。

public static function onWorkerStart($businessWorker){
        // 每N秒執(zhí)行一次
        $time_interval = 60;
        Timer::add($time_interval, function () {
            echo "[" . date("m-d H:i:s") . "] " . 'onWorkerStart 分鐘定時(shí)器' . "\n";

            # 進(jìn)行同步或者異步的數(shù)據(jù)庫(kù)寫入操作
        });
}

重啟服務(wù)后,會(huì)連續(xù)打印4條數(shù)據(jù)。說明定時(shí)器執(zhí)行了4次。

[10-06 18:27:15] onWorkerStart 分鐘定時(shí)器
[10-06 18:27:15] onWorkerStart 分鐘定時(shí)器
[10-06 18:27:15] onWorkerStart 分鐘定時(shí)器
[10-06 18:27:15] onWorkerStart 分鐘定時(shí)器

要在定時(shí)器內(nèi)執(zhí)行異步的數(shù)據(jù)庫(kù)寫入操作,如何讓多進(jìn)程下,只有一個(gè)全局定時(shí)器呢?

數(shù)據(jù)庫(kù)連接的次數(shù)

Event::onWorkerStart里設(shè)置了mysql和Redis數(shù)據(jù)庫(kù)的初始化配置。
如果有4個(gè)businessworker進(jìn)程,這里就會(huì)初始化4次。

重復(fù)的配置和初始化,會(huì)不會(huì)造成資源浪費(fèi)呢?
能不能只初始化一次,全局所有的onMessage事件里就可以用呢。

567 2 0
2個(gè)回答

ximengxuan

找到一個(gè)解決的辦法,僅供參考。如果有更好的辦法,歡迎提出來(lái)。

先在Events.php里創(chuàng)建一個(gè)測(cè)試函數(shù)

    public static function test()
    {
        echo "[" . date("m-d H:i:s") . "] " . 'Events 內(nèi)的定時(shí)執(zhí)行的方法' . "\n";

        // 這里可以引用類里面的一些變量和方法,執(zhí)行定時(shí)操作

    }

然后在start_worker.phponWorkerStart里創(chuàng)建一個(gè)定時(shí)器,調(diào)用Events.php里的測(cè)試方法

require_once 'Events.php';

$task_worker->onWorkerStart = function ($worker) {

    // 每N秒執(zhí)行一次
    $time_interval = 60;
    Timer::add($time_interval, function () {
        echo "[" . date("m-d H:i:s") . "] " . 'onWorkerStart 獨(dú)立的分鐘定時(shí)器' . "\n";

        // 測(cè)試定時(shí)調(diào)用
        $Events = new Events();
        $Events->test();

    });
};

實(shí)測(cè)這個(gè)定時(shí)器是單進(jìn)程的,每分鐘會(huì)執(zhí)行一次。而不是每分鐘連續(xù)執(zhí)行4次

然而、但是,上面這個(gè)簡(jiǎn)單的例子是可以執(zhí)行的。
寫了個(gè)復(fù)雜點(diǎn)的,在定時(shí)器里執(zhí)行Redis寫入操作,就報(bào)錯(cuò)了:

Warning: stream_socket_client(): unable to connect to tcp://127.0.0.1:1236 (Connection refused) in /GatewayWorker/vendor/workerman/gateway-worker/src/Lib/Gateway.php on line 1346
[10-06 19:34:18] onWorkerStart  Error:Exception: Can not connect to tcp://127.0.0.1:1236 Connection refused in /GatewayWorker/vendor/workerman/gateway-worker/src/Lib/Gateway.php:1352
Stack trace:

看來(lái)這個(gè)方法還是不能做數(shù)據(jù)庫(kù)操作啊。期待更好的辦法。

  • 暫無(wú)評(píng)論
小Z先生

試試這樣


public static function onWorkerStart($businessWorker){
        if(businessWorker->id ==0){
            // 每N秒執(zhí)行一次
            $time_interval = 60;
            Timer::add($time_interval, function () {
                echo "[" . date("m-d H:i:s") . "] " . 'onWorkerStart 分鐘定時(shí)器' . "\n";

                # 進(jìn)行同步或者異步的數(shù)據(jù)庫(kù)寫入操作
            });
        }
}
??