成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

進程間通信

Richard_Gao / 860人閱讀

摘要:接受不到消息消息隊列通過指定而被創(chuàng)建后,任意一方銷毀了該隊列,都會導(dǎo)致其他發(fā)送或接收方失敗。用法場景進程,中代碼段要用到中代碼段的結(jié)果。完成了進程間同步問題此外進程間通信采用的方式是共享內(nèi)存。

參考文章

深刻理解Linux進程間通信(IPC)

進程間通信(IPC)介紹

php高級應(yīng)用之進程控制及進程間通訊 workman 作者發(fā)布

PHP 相關(guān)進程間通信擴展
-- System V IPC:

sysvmsg 消息隊列
sysvsem 信號量
sysvshm 共享內(nèi)存


-- BSD IPC

socket(stream)

-- POSIX IPC
posix 信號量
posix 共享內(nèi)存
posix 消息隊列
sysvmsg(消息隊列)

php ftok 函數(shù)作用解析

php ftok 參數(shù)2坑!

用途:

解決進程間通信問題

用法:

發(fā)送方(send.php)

$key = 1;

$msg = "發(fā)送方發(fā)送的消息";

$q = msg_get_queue($key);

$send = msg_send($q , 1 , $msg , true , true);

if ($send) {
    echo "消息發(fā)送成功" . PHP_EOL;
} else {
    echo "消息發(fā)送失敗" . PHP_EOL;
}

接收方(receive.php

$key = 1;

$q = msg_get_queue($key);

/**
 * 第二個參數(shù)解釋:
    < 0 ,小于該絕對值的最小類型隊列上的第一條記錄
        例如我設(shè)置了 -5,絕對值 5
        該消息隊列的消息類型有 2 3 4 5 6 7
        則返回類型為 2 的消息隊列上的第一條記錄
    0 則獲取隊列第一條消息(不管消息類型,標(biāo)識符)
    1 獲取設(shè)置類型下的第一條消息
    
    第三個參數(shù)必須是個變量?。拥呢洠。? */
msg_receive($q , 1 , $msg_type , 1024 , $msg , true , MSG_NOERROR , $error_code);
錯誤處理

無權(quán)限訪問

有可能你會碰到訪問無權(quán)限訪問隊列的情況。那是因為你的代碼長這樣。我也忘了是怎樣修復(fù)的,后面自動好了。

接受不到消息

消息隊列通過指定 key 而被創(chuàng)建后,任意一方銷毀了該隊列,都會導(dǎo)致其他發(fā)送 或 接收方失敗。

信號量(sysvsem) + 共享內(nèi)存(sysvshm) 用途:

注意了:解決進程間同步問題。

用法

場景:進程 A 、B、C,B 中代碼段 y 要用到 A 中代碼段 x 的結(jié)果。C 中代碼段 m 要用到 B 中代碼段 y 的結(jié)果。

$key = ftok(__FILE__ , 1);

$shm = shm_attach($key);

create(3 , [
    // 進程 A
    function($index) use($key , $shm){
       $sem_id = sem_get($key);
       
       // 獲取信號量?。ㄆ渌嗤@取該信號量的進程等待,直到該信號量被釋放為止)
       sem_acquire($sem_id);
       
        // x 處理語句
       shm_put_var($shm , 1 , 10);
       
       $wait = 3;
       $count = 1;
       
       while ($count >= $wait)
       {
           echo "進程 A 等待處理" . $count++ . "s" . PHP_EOL;
           
           sleep(1);
       }
       
       // 3s 后釋放信號量
       sem_release($shm);
       
    } , 
    // 進程 B
    function($index) use($key , $shm){ 
       $sem_id = sem_get($key);
       
        // 獲取信號量?。ㄆ渌嗤@取該信號量的進程等待,直到該信號量被釋放為止)
       sem_acquire($sem_id);
       
        // x 處理語句返回結(jié)果
        $x = shm_get_var($shm , 1);
        $y = $x + 11;
        
        shm_put_var($shm , 2 , $y);
       
        $wait = 5;
        $count = 1;
       
        while ($count >= $wait)
        {
           echo "進程 B 等待處理" . $count++ . "s" . PHP_EOL;
           
           sleep(1);
        }
        
        // 5s 后釋放信號量
        sem_release($shm);
    } , 
    // 進程 C
    function($index) use($key , $shm){
        $sem_id = sem_get($key);
       
        // 獲取信號量!(其他相同獲取該信號量的進程等待,直到該信號量被釋放為止)
       sem_acquire($sem_id);
       
        // x 處理語句返回結(jié)果
        $y = shm_get_var($shm , 2);
        $c = $x + 12;
        
        echo "獲取到結(jié)果:" . $c;
        
        // 刪除共享內(nèi)存段
        sem_remove($shm);
    } , 
];

解釋:A 首先獲取到信號量,然后等待 3s 后釋放,期間 B、C在調(diào)用 sem_acquire 后阻塞,直到獲取到該信號量為止。A 釋放信號量后,B 現(xiàn)獲取,然后阻塞 5s 釋放,最后 C 獲取,執(zhí)行。完成了進程間同步問題!此外進程間通信采用的方式是共享內(nèi)存。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/30646.html

相關(guān)文章

  • PHP進程通信

    摘要:一進程間通信理解間進程通信機制,先了解下進程間有哪些通訊機制歷史發(fā)展按照歷史來源主要有兩大塊的管道,,信號的消息隊列,共享內(nèi)存,信號燈。信號量主要作為進程間,以及進程內(nèi)部線程之間的通訊手段。主要依賴,兼容擴展實現(xiàn)方式的進程間通信之消息隊列。 PHP間進程如何通信,PHP相關(guān)的服務(wù)的IPC是實現(xiàn)方式,IPC的思想如何用到項目中。 一、linux進程間通信 理解php間進程通信機制,先了解...

    haobowd 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<