客户端自定义定时任务,量多的时候怎么办?

MK

客户端自定义定时任务,量多的时候怎么办?有什么方法解决大量定时任务?

345 3 1
3个回答

Tinywan

不知道你现在有多少个

2548a

什么类型的任务?里面会不会有长时间阻塞的,如果没有的话,只是类似于闹钟的话,完全可以用一个定时器来解决,不需要每个任务一个定时器.

  • MK 18天前

    就是类似闹钟这种,请问一个定时器的逻辑是什么?扫表吗?

2548a

不用扫表,在onWorkerStart 一次性获取全部,然后用自增id作为数组键保存,然后开启个text 协议监听,类似于这样

   /**
     * @param TcpConnection $connection
     * @param $buffer
     * @return void
     * 开启text协议监听
     */
    public function onMessage(TcpConnection $connection, $buffer)
    {
        $data = json_decode($buffer, true);

        $id = $data['id'] ?? '';
        $item = $data['item'] ?? [];
        $route_type = $data['route_type'] ?? '';

        if ($route_type === 'addTask'){
            $this->addTask($id,$item);
        }else if ($route_type === 'removeTask'){
            $this->removeTask($id);
        }
        $connection->send(true ? 'ok' : 'fail');
        $connection->close();
    }

    /**
     * @param $id int 数据库自增id
     * @param $item array 任务内容
     * @return void
     * 添加任务
     */
    private function addTask($id,$item){
        $this->task_list[$id] = $item;
    }

    /**
     * @param $id int 数据库自增id
     * @return void
     * 删除任务
     */
    private function removeTask($id){
        if (isset($this->task_list[$id])){
            unset($this->task_list[$id]);
        }
    }

然后添加任务,或者删除任务的时候,用这个连接text端口添加或者删除任务就行了.

/**
 * @param array $data
 * @return bool
 * 发送text协议
 */
function sendTextSocket( $data = [])
{
    $address = '127.0.0.1:5678';
    // 建立socket连接到内部推送端口
    $client = stream_socket_client('tcp://' . $address , $errno, $errmsg, 1);

    // 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
    fwrite($client, json_encode($data) . "\n");
    // 读取推送结果
    $res = fread($client, 8192);
}
🔝