账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    如何获取swoole server worker待执行的任务
    60
    0

    假设我开启了5个worker,都是使用onpipemessage接收信息,每次处理有一定的耗时:

    function test(){
        sleep(10);
        echo 'done';
    }

    然后我使用一个swoole_timer_tick,每秒执行10次,给随机一个worker发送sendmessage:

    swoole_timer_tick(100, function()use($server){
        $status = $server->sendMessage($message,$worker_id);
        if($status) echo 'send succeed';    
    });

    当开启这个server,看到每秒输出10次'send succeed',可以知道每次sendMessage都是成功的,但是5个worker每次处理一个任务需要10秒,很明显可以看出worker的处理速度比sendMessage的速度要慢,随着时间推移,每个worker积压的待执行任务会越来越多。
    那么可以用哪些参数或者是方法得出worker待执行任务的数量?或者说像这种输入比处理速度高的时候可以怎样进一步优化?

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 拿稳自我再说话 普通会员 1楼

      在Swoole中,获取Server Worker(worker)等待执行的任务,可以通过以下步骤实现:

      1. 使用WorkerManager接口获取Worker对象:首先,你需要创建一个Swoole的ServerManager对象,通过ServerManager::addWorker方法添加一个Worker对象到ServerManager的worker列表中。这个Worker对象将被看作是server的worker,可以通过ServerManager::getWorkerById方法获取到。

      ```php use Swoole\Server; use Swoole\WorkerManager;

      $server = new Server(); $server->on('connect', function ($server, $fd) { echo "Worker connected, id: {$fd}\n"; $workerManager = new WorkerManager(); $worker = $workerManager->addWorker($fd); });

      // ... ```

      1. 使用Worker接口获取Worker的实例:Worker类提供了一系列方法来操作和管理Worker对象,其中next()方法返回一个指向下一个任务的指针,run()方法用于执行任务,shutdown()方法用于关闭Worker对象,getInfo()方法用于获取Worker对象的详细信息等。

      ```php use Swoole\Worker;

      $worker = $server->getWorkerById(1); echo "Worker: {$worker->getWorkerName()} - Id: {$worker->getId()}\n"; $worker->run(); echo "Worker: {$worker->getWorkerName()} - Info: {\n"; $worker->info(); echo "\n}\n"; ```

      1. 使用WorkerPool接口获取WorkerPool对象:WorkerPool类是Swoole中处理Worker请求和任务调度的核心模块,通过WorkerPool::addWorker方法添加Worker到WorkerPool中,WorkerPool::getWorkerById方法获取到Worker对象。

      ```php use Swoole\Server; use Swoole\WorkerPool;

      $server = new Server(); $server->on('connect', function ($server, $fd) { echo "Worker connected, id: {$fd}\n"; $workerPool = new WorkerPool(); $worker = $workerPool->addWorker($fd); });

      // ... ```

      1. 使用WorkerPool接口获取WorkerPool的实例:WorkerPool类提供了一系列方法来操作和管理WorkerPool对象,其中addWorker方法用于添加Worker到WorkerPool中,getWorkerById方法用于获取Worker对象。

      ```php use Swoole\WorkerPool;

      $workerPool = $server->getWorkerPool(); echo "WorkerPool: {$workerPool->getWorkerPoolName()} - Id: {$workerPool->getWorkerPoolId()}\n"; $worker = $workerPool->getWorkerById(1); echo "WorkerPool: {$workerPool->getWorkerPoolName()} - Id: {$workerPool->getWorkerPoolId()}\n"; $worker->run(); echo "WorkerPool: {$workerPool->getWorkerPoolName()} - Info: {\n"; $workerPool->info(); echo "\n}\n"; ```

      通过以上步骤,你可以获取到Server Worker(worker)等待执行的任务,这些任务可以通过调用Worker的next()方法和run()方法来执行,或者通过调用WorkerPool的addWorkergetWorkerById方法来获取WorkerPool对象并获取Worker对象。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部