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

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

ximengxuan

如何設置全局唯一的定時器

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

$worker->count = 4;

Events.php文件的onWorkerStart事件里設置了一個定時器。

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

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

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

[10-06 18:27:15] onWorkerStart 分鐘定時器
[10-06 18:27:15] onWorkerStart 分鐘定時器
[10-06 18:27:15] onWorkerStart 分鐘定時器
[10-06 18:27:15] onWorkerStart 分鐘定時器

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

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

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

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

533 2 0
2個回答

ximengxuan

找到一個解決的辦法,僅供參考。如果有更好的辦法,歡迎提出來。

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

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

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

    }

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

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 獨立的分鐘定時器' . "\n";

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

    });
};

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

然而、但是,上面這個簡單的例子是可以執(zhí)行的。
寫了個復雜點的,在定時器里執(zhí)行Redis寫入操作,就報錯了:

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:

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

  • 暫無評論
小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 分鐘定時器' . "\n";

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