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

請問如何實現“定時器添加和刪除放在同一個進程”

chroisen

使用GatewayWorker,在Events類中需要實現:

4進程,在一個多用戶房間內,服務器設定一個定時器,20秒后取消。但是還剩下15秒的時候,服務器需要取消該定時器。調用Timer::del($timer_id)后仍然會執(zhí)行。

請問如何實現“定時器添加和刪除放在同一個進程”?

場景:

一個房間有6個人,6回合你畫我猜。10秒選詞,60秒畫,5秒答案展示。

10秒選詞:
選詞開始,設定10秒定時器,告知大家當前回合的題目。如果用戶1在5秒的時候選詞了,就要清除這個定時器。如果10秒后用戶未選詞,系統自動選詞(定時器內自動清除,這個沒問題)

添加定時器后得到timerid 存起來 然后當你收到用戶選詞的消息后 刪除這個timerid。這個方法嘗試過吧timerid存在數據庫,讀取出來清除,但是不成功。

可能過程中,設定定時器和5秒時消除定時器不在一個進程,所以總是清除不成功……

3644 3 1
3個回答

keytehu

定時器里讀下數據庫里的timeid是否存在,存在的話就運行,不存在就刪除自己。
也就是刪除定時器改成刪除數據庫里的timerid

  • 暫無評論
maq

問題的原因應該就是你說的,刪除定時器跟創(chuàng)建定時器不在同一個進程。每個進程的 timer id 是各自獨立分配的。

可以開一個進程專門用于處理定時器邏輯,所有的 BusinessWorker 跟這個進程通信,發(fā)出需要創(chuàng)建、刪除定時器的指令(可以用房間號來標識定時器),如果定時器未刪除而觸發(fā),就通知所有 BusinessWorker 做該做的事。

  • chroisen 2018-02-27

    邏輯是明白的,但是請問可否提供一個“開一個專門的進程處理定時器”的例子呢?非常感激~

maq

@chroisen:大概就是這個樣子吧,不知道算不算你想要的例子:

$worker = new Worker("frame://127.0.0.1:1234");
$worker->onMessage = function($connection, $data) {
  $cmd = json_decode($data, true);
  if ($cmd) {
    Timer::add(...);
  } else if ($cmd) {
    Timer::del(...);
  }
};
年代過于久遠,無法發(fā)表回答
??