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();