Swoole進(jìn)程間通信的方式
管道pipe
管道用于進(jìn)程之間的數(shù)據(jù)交互,Linux系統(tǒng)本身提供了pipe函數(shù)用于創(chuàng)建一個(gè)半雙工通信管道。半雙工的通信方式中數(shù)據(jù)只能單向流動(dòng)(一端只讀一端只寫),只能在具有親緣關(guān)系(父子進(jìn)程)的進(jìn)程之間使用。 (推薦學(xué)習(xí): swoole視頻教程)
管道是進(jìn)程間通信IPC中最基礎(chǔ)的方式,管道有兩種類型分別是命名管道、匿名管道。
匿名管道:專門用于具有血緣關(guān)系的進(jìn)程之間,完成數(shù)據(jù)傳遞。命名管道:可以用在任何兩個(gè)進(jìn)程之間,Swoole中的管道都是匿名管道。
在Swoole中利用eventfd和UnixSock封裝了兩種管道,使得進(jìn)程之間的通信更加靈活。
Swoole的Process模塊內(nèi)置了管道的方式用于進(jìn)程間通信,在構(gòu)建Process實(shí)例時(shí)只要開啟了$pipe_type選項(xiàng),Swoole底層會(huì)自動(dòng)創(chuàng)建一個(gè)管道,這里需要說明的時(shí),雖然名字上叫做管道,但實(shí)際上在新版Swoole中底層通信是通過UnixSock實(shí)現(xiàn)的,所以并不是真正意義上的Linux Pipe。
創(chuàng)建進(jìn)程
swoole_process::__construct( callable $function, bool $redirect_stdin_stdout = false, int $pipe_type = SOCK_DGRAM, bool $enable_coroutine = false );
管道類型$pipe_type可分為三種:
0表示不創(chuàng)建管道
1表示創(chuàng)建SOCK_STREAM類型的管道
2表示創(chuàng)建SOCK_DGRAM類型的管道
當(dāng)啟用$redirect_stdin_stdout后,$pipe_type選項(xiàng)將忽略用戶參數(shù),強(qiáng)制為1。
管道描述符
當(dāng)進(jìn)程被fork出來后,父進(jìn)程和子進(jìn)程中的Process對(duì)象會(huì)被設(shè)置上一個(gè)名為pipe的成員變量,存放著底層UnixSocket的描述符,父進(jìn)程和子進(jìn)程可以通過這個(gè)管道描述符來發(fā)送數(shù)據(jù),也可以直接調(diào)用Process提供的read/write接口來收發(fā)數(shù)據(jù)。
object(SwooleProcess)#1 (6) { ["pipe"]=>int(4) ["callback"]=>NULL ["msgQueueId"]=>NULL ["msgQueueKey"]=>NULL ["pid"]=>int(287) ["id"]=>NULL}
管道讀寫
swoole_process->write(string $data) 向進(jìn)程的管道中寫入數(shù)據(jù)
swoole_process->read(int $buffer_size = 8192) 從進(jìn)程的管道中讀取數(shù)據(jù)
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com