- 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 条
- 全部回答
-
拿稳自我再说话 普通会员 1楼
在Swoole中,获取Server Worker(worker)等待执行的任务,可以通过以下步骤实现:
- 使用
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); });
// ... ```
- 使用
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"; ```
- 使用
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); });
// ... ```
- 使用
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的addWorker和getWorkerById方法来获取WorkerPool对象并获取Worker对象。 - 使用
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

