首頁 >php框架 >Swoole >swoole支援多執行緒嗎?

swoole支援多執行緒嗎?

青灯夜游
青灯夜游原創
2019-12-25 18:18:244252瀏覽

swoole支援多執行緒嗎?

Reactor執行緒

Swoole\Server的主程序是一個多執行緒的程式。其中有一組很重要的線程,稱為Reactor線程。它就是真正處理TCP連接,收發資料的線程。

Swoole的主線程在Accept新的連接後,會將這個連接分配給一個固定的Reactor線程,並由這個線程負責監聽此socket。在socket可讀時讀取數據,並進行協定解析,將請求投遞到Worker進程。在socket可寫入時將資料傳送給TCP客戶端。

分配的計算方式是fd % serv->reactor_num

#由於PHP語言不支援多執行緒,因此Swoole使用多進程模式。在多進程模式下存在進程記憶體隔離,在工作進程內修改global全域變數和超全域變數時,在其他行程是無效的。

設定worker_num=1時,不存在進程隔離,可以使用全域變數儲存資料

進程隔離

$fds = array();
$server->on('connect', function ($server, $fd){
    echo "connection open: {$fd}\n";
    global $fds;
    $fds[] = $fd;
    var_dump($fds);
});

$fds 雖然是全域變量,但只在目前的進程內有效。 Swoole伺服器底層會建立多個Worker進程,在var_dump($fds)列印出來的值,只有部分連接的fd。

對應的解決方案就是使用外部儲存服務:

#資料庫,如:MySQL、MongoDB
快取伺服器,如:Redis、Memcache
磁碟文件,多進程並發讀寫時需要加鎖

普通的資料庫和磁碟檔案操作,存在較多IO等待時間。因此建議使用:

Redis 記憶體資料庫,讀寫速度非常快
/dev/shm 記憶體檔案系統,讀寫操作全部在記憶體中完成,無IO消耗,效能極高
除了使用儲存之外,還可以使用共享記憶體來保存資料

推薦學習: swoole影片教學

以上是swoole支援多執行緒嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn