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

關(guān)于workerman的工作模式

1024

問題描述

workerman的工作模式不就是swoole的單線程模式(SWOOLE_BASE)嗎?
swoole的文檔中寫道(https://wiki.swoole.com/wiki/page/353.html):
每個Worker進程同時承擔了Process模式下Reactor線程和Worker進程兩部分職責
其實就是reactor模型的單線程模式,對吧?在reactor模型的單線程模式的某個線程中,如果回調(diào)函數(shù)或者叫事件處理函數(shù)十分耗時,那么就無法執(zhí)行到epoll_wait,于是無法立即處理后面的事件

情況1:設(shè)置workerman的count=1,對應于一個reactor單線程模式。那么只有一個邏輯CPU在處理所有請求,如果一個請求執(zhí)行耗時操作中,那么下一個請求就進不來;

情況2:設(shè)置workerman的count=n(>1),對應于多個reactor單線程模式。假設(shè)某個worker進程(該進程是單線程的)的回調(diào)函數(shù)執(zhí)行了耗時的操作,但是下一個請求可以負載均衡分配到其它的worker進程(該進程是單線程的),還是可以立即響應的。我的理解是對的吧?

代碼

情況1:count=1,回調(diào)函數(shù)handle_message中sleep(100)

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$global_uid = 0;

// 當客戶端連上來時分配uid,并保存連接,并通知所有客戶端
function handle_connection($connection)
{
    global $text_worker, $global_uid;
    // 為這個連接分配一個uid
    $connection->uid = ++$global_uid;
    echo "[{$global_uid}]連接成功\n";
}

// 當客戶端發(fā)送消息過來時,轉(zhuǎn)發(fā)給所有人
function handle_message(TcpConnection $connection, $data)
{
    ...
    sleep(100);
}

// 當客戶端斷開時,廣播給所有客戶端
function handle_close($connection)
{
    ...
}

// 創(chuàng)建一個文本協(xié)議的Worker監(jiān)聽2347接口
$text_worker = new Worker("text://0.0.0.0:2347");

// 只啟動1個進程,這樣方便客戶端之間傳輸數(shù)據(jù)
$text_worker->count = 1;

$text_worker->onConnect = 'handle_connection';
$text_worker->onMessage = 'handle_message';
$text_worker->onClose = 'handle_close';

Worker::runAll();

情況2:count=4,回調(diào)函數(shù)handle_message中sleep(100)

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$global_uid = 0;

// 當客戶端連上來時分配uid,并保存連接,并通知所有客戶端
function handle_connection($connection)
{
    global $text_worker, $global_uid;
    // 為這個連接分配一個uid
    $connection->uid = ++$global_uid;
    echo "[{$global_uid}]連接成功\n";
}

// 當客戶端發(fā)送消息過來時,轉(zhuǎn)發(fā)給所有人
function handle_message(TcpConnection $connection, $data)
{
    ...
    sleep(100);
}

// 當客戶端斷開時,廣播給所有客戶端
function handle_close($connection)
{
    ...
}

// 創(chuàng)建一個文本協(xié)議的Worker監(jiān)聽2347接口
$text_worker = new Worker("text://0.0.0.0:2347");

// 啟動4個進程
$text_worker->count = 4;

$text_worker->onConnect = 'handle_connection';
$text_worker->onMessage = 'handle_message';
$text_worker->onClose = 'handle_close';

Worker::runAll();
1384 1 1
1個回答

walkor 打賞

對,workerman的工作模式類似swoole的SWOOLE_BASE。
情況1:是的
情況2:看情況,如果是長連接應用,假設(shè)客戶端A和客戶端B都連在同一個進程上,當進程處理客戶端A的的請求時,客戶端B發(fā)的請求仍然會發(fā)到這個進程上。如果是短連接應用,假設(shè)進程A在處理客戶端A的請求,這時客戶端B發(fā)起連接,這時候客戶端B會連接到其它空閑的進程上,請求也會發(fā)給空閑的進程。

年代過于久遠,無法發(fā)表回答
??