午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > 淺談并發處理PHP進程間通信之外部介質

淺談并發處理PHP進程間通信之外部介質

熱門標簽:常州地圖標注服務商 福州人工外呼系統哪家強 安裝電銷外呼系統 新河科技智能外呼系統怎么樣 釘釘打卡地圖標注 衡水外呼系統平臺 百度商鋪地圖標注 地圖標注平臺怎么給錢注冊 注冊400電話申請

進程間通信

進程間通信,指至少兩個進程或線程間傳送數據或信號的一些技術或方法。進程是計算機系統分配資源的最小單位(嚴格說來是線程)。每個進程都有自己的一部分獨立的系統資源,彼此是隔離的。為了能使不同的進程互相訪問資源并進行協調工作,才有了進程間通信。

根據定義可知,要進行進程間通信,我們需要解決兩個問題:

  • 互相訪問:消息傳輸和暫時存儲介質選擇問題;
  • 協調工作:消息的存取沖突問題;

文章介紹的中心就是圍繞著這么兩點來說的, 為了更使文章更簡明,這邊以之前在公司做的一個需求為例:

需要一個循環ID生成器,循環生成從 Min 到 Max 的數字ID,在ID遞增到 Max 后,返回到 Min 重新開始遞增;必須能保證多個進程并發請求時生成的ID不同。

此需求要解決的問題恰好為我們要解決的進程間通信需要解決的兩個問題:

  • 需要一個消息傳輸通道來傳輸和存儲當前的遞增值。這個比較容易解決,我們常用的文件、數據庫、session、緩存等都能做到。
  • 需要解決多進程同時訪問生成器生成相同ID的問題。要滿足這個需要就必須要用到鎖了,而且為了保證多個進程讀取的數據是不同的,需要互斥鎖,另外為了能保證調用成功率,鎖的獲取最好能實現自旋。

本文通過此需求的不同實現,來介紹通過外部介質進行的進程間通信的方式。另外,不只PHP語言,其他語言也能使用這些方法。

文件

flock

文件是最基本的存儲介質,它當然可以作為消息的傳輸通道來使用。文件的存取各種語言都有各自的多種方案,問題點是多進程并發時的沖突問題。

解決存取沖突問題我們使用PHP的flock()函數:

bool flock ( resource $handle , int $operation [, int $wouldblock ] )

$handler 是 使用fopen($path_to_file)獲取到的文件句柄;

$operation 是 對文件加鎖的方式,有以下值可選:

LOCK_SH (獲取共享鎖) / LOCK_EX (獲取互斥鎖) / LOCK_UN (解鎖)

這里我們選用互斥鎖,一個進程獲取到互斥鎖后,其他進程在嘗試獲取鎖會被阻塞,直到鎖被釋放,即實現了自旋;

此外,還有一個參數 LOCK_NB,flock 在獲取不到鎖時,默認會阻塞住直到鎖被其他進程釋放,傳入 LOCK_NB 與 LOCK_SH 或 LOCK_EX 進行或運算結果(LOCK_EX | LOCK_NB),flock 在鎖被其他進程占有時,不會阻塞,而是直接返回 false,這里僅作介紹,我們并不使用它。

$wouldblock 參數是一個引用值,在獲取不到鎖,且不阻塞模式時,$wouldblock 會被設置為 true;(手冊中說阻塞時才會被設置為 true。其實我也奇怪這個變量名的。不知道是不是 bug,我的PHP版本是 5.4.5,有知道的煩請解惑)

代碼實現

下面是循環ID生成器代碼,說明在注釋中:

function getCycleIdFromFile($max, $min = 0) {
    $handler = fopen('/tmp/cycle_id_generator.txt', 'c+');
    if (!flock($handler, LOCK_EX)) {
        throw new Exception('error_get_file_lock!');
    }
    
    $cycle_id = trim(fread($handler, 9));
    $cycle_id++;

    if ($cycle_id > $max) {
        $cycle_id = $min;
    }

    // 文件指針返回到文件頭,并向文件內寫入新的cycle_id
    rewind($handler);
    fwrite($handler, $cycle_id);

    // 多寫入一些空格為了防止數值升到多位后,突然置為少位后面的數字仍保留
    fwrite($handler, str_repeat(' ', 9));

    flock($handler, LOCK_UN);

    return $cycle_id;
}

mysql

select for update

我們常用的 mysql 也可以被當作中間介質來實現進程間的通信,我們規定好某一個數據表內的某一行數據作為消息交換的中轉站,使用 mysql 自帶的鎖來協調多個進程的存取沖突。

事務的設計目的就是為了解決多進程并發查詢時數據沖突的問題,可是我們常用的事務只能保證數據沖突時會被回滾,數據不會出現錯誤,并不能實現請求的并行化。對一些數據沖突回滾的請求,需要我們在外層添加邏輯重試。

這里介紹 mysql 的一種語法: select for update,會給固定數據加上互斥鎖,且另一個請求在獲取鎖失敗時,會阻塞至獲取鎖成功,mysql 幫我們實現了自旋;

用法如下:

1.關閉 mysql 的自動提交,自動提交默認打開,除非使用 transition 語句顯示開啟事務,默認會將每一條 sql 作為一個事務直接提交執行,這里關閉。 set autocommit=0;

2.使用select for update 語句給數據添加互斥鎖。注意:需求 mysql 的 innodb 引擎支持;

3.進行數據更新和處理操作;

4.主動提交事務,并將 自動提交恢復;commit; set autocommit=1;

代碼實現

然后是代碼實現:

// 數據庫連接實現各有不同,demo 可以自己修改一下。
function getCycleIdFromMysql($max, $min = 0){
    Db::db()->execute('set autocommit = 0');
    $res = Db::db()->qsqlone('SELECT cycle_id FROM cycle_id_generator WHERE id = 1 FOR UPDATE');

    $cycle_id = $res['cycle_id'] + 1;
    if($cycle_id > $max){
        $cycle_id = $min;
    }

    Db::db()->execute("UPDATE cycle_id_generator SET cycle_id = {$cycle_id} WHERE id = 1");

    Db::db()->execute('commit');
    Db::db()->execute('set autocommit = 1');

    return $cycle_id;
}

redis

incr

redis 是我們常用的緩存服務器,由于其使用內存存儲數據,性能很高。我們使用一個固定的普通鍵來作為消息中轉站,然后利用其incr命令的原子性和其執行結果(遞增后的值),實現 cycle_id 的遞增。

incr(key) 若 key 不存在,redis 會先將值設置為0,然后執行遞增操作;

遞增沒有問題,可是我們還有個需求是在要其值達到 max 時,再將其置為 min,這時就可能會出現進程A在更新值為 min 時,另一個進程B也檢測到值大于了 max,然后將值置為 min,可是這時的值已經不是 max,即發生了值重復更新,那么返回的值必然會有重復;

這時,我們就需要自己來實現鎖了。

SETNX

redis 的 SETNX 命令檢測某一個 key 是否存在,若不存在,則將 key 的值設置為 value,并返回結果1; 若 key 已存在,則設置失敗,返回值0。

SETNX key value

它能實現鎖是因為它是一個原子命令,即 檢測 key 是否存在和設置 key 值在一個事務內,不會出現同時兩個進程都檢測到 key 不存在,然后同時去設置 key 的情況。

我們以另一個值的存在與否,來表示 cycle_id 是否正在被另一個進程修改。

代碼實現

 function getCycleIdFromRedis($max, $min = 0) {
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $key_id = 'cycle_id_generator';

    $cycle_id = $redis->incr($key_id);
    
    if ($cycle_id > $max) {
        // 設置"鎖鍵"的結果 = 獲取互斥結果
        $key_lock = 'cycle_id_lock';
        if (!$redis->setnx($key_lock, 1)) {
            return null;
        }

        $cycle_id = $min;
        $redis->set($key_id, $cycle_id);

        // 最后別忘記釋放互斥鎖
        $redis->delete($key_lock);
    }

    $redis->close();

    return $cycle_id;
}

注意:由于 redis 里沒有能實現自旋鎖的命令,如果需求最高的獲取成功率,我們在檢測到 cycle_id 已經是最大值,且試圖修改獲取鎖失敗時,退出重試,在外層進行重試。

function getCycleId($max, $min = 0) {
    $cycle_id = getCycleIdFromRedis($max, $min);
    if (!is_null($cycle_id)) {
        return $cycle_id;
    }
    // 稍微等待下正在更改的進程
    usleep(500);
    // 這里使用遞歸,直至獲取成功  并發很高,cycle_id重置很頻繁時慎用.
    return getCycleId($max, $min);
}

優化

審查代碼我們會發現,如果 max-min 的值很小的話,redis 會需要經常重置 key 的值,也就經常需要加鎖,重試也就很多。這里,我提供一個優化方法:

我們將其 max 設置為一個很大的值(要能被 max-min 整除),返回值時稍做處理,返回 $current % ($max - $min) + $min;。這樣,key 需要遞增到一個很大的值才會被重置,加鎖邏輯和外層邏輯會很少執行到,達到提升效率的目的。

總結

這里簡單的評價一下上面所說的三種方法:

性能上沒有測試,而且 redis 的性能跟 ID 的大小差值相關,不過猜測在ID大小差值大的情況下 redis 應該更好一點。

代碼上非常直觀,使用 mysql 非常簡潔,而且 redis 要自己實現自旋,比較惡心。

實現上,當然是文件最為方便,無任何添加。

以上就是淺談并發處理PHP進程間通信之外部介質的詳細內容,更多關于并發處理PHP進程間通信之外部介質的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • PHP下用Swoole實現Actor并發模型的方法
  • 淺談并發處理PHP進程間通信之System V IPC
  • PHP+Redis鏈表解決高并發下商品超賣問題(實現原理及步驟)
  • 詳解PHP中curl_multi并發的實現
  • php多進程并發編程防止出現僵尸進程的方法分析
  • PHP高并發和大流量解決方案整理
  • PHP 并發場景的幾種解決方案
  • php多進程模擬并發事務產生的問題小結
  • 淺談Swoole并發編程的魅力

標簽:鶴崗 遼陽 鷹潭 六安 柳州 克拉瑪依 唐山 白城

巨人網絡通訊聲明:本文標題《淺談并發處理PHP進程間通信之外部介質》,本文關鍵詞  淺談,并發,處理,PHP,進程,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺談并發處理PHP進程間通信之外部介質》相關的同類信息!
  • 本頁收集關于淺談并發處理PHP進程間通信之外部介質的相關信息資訊供網民參考!
  • 推薦文章
    很污的网站在线观看| 久久久久久亚洲中文字幕无码| 国产成人激情视频| 亚洲777理论| 日本精品久久久久| 黄色a一级视频| 日本一区二区三区视频在线观看 | 欧美日韩偷拍视频| 男人添女荫道口女人有什么感觉| 欧美日韩国产成人在线| 亚洲成a人片在线不卡一二三区| 亚洲AV无码一区二区三区性 | 九一久久久久久| 午夜成人亚洲理伦片在线观看| 亚洲国产一区二区三区在线| 欧美激情精品久久久久久蜜臀| 精品国产1区2区| 久久精品99国产精品| 久草资源在线视频| 99免费视频观看| 亚洲bt欧美bt日本bt| 日韩经典中文字幕| 亚洲视频在线一区观看| 天堂中文在线观看视频| 黑人狂躁日本娇小| 无码无遮挡又大又爽又黄的视频| 成人性生交大片免费看视频直播| 亚洲国产毛片完整版| 中文字幕免费一区| 熟妇高潮一区二区高潮| 亚洲一级生活片| 日本一极黄色片| 国产精品视频免费观看| 日韩一区av在线| 色婷婷综合久久| 高清国产一区二区| 亚洲一级在线播放| 亚洲一二三四五| 亚洲看片网站| 国产精品99久久久久久白浆小说| 欧美大肚乱孕交hd孕妇| 国产精品成人在线观看 | 欧美精品99久久久**| 久久网站热最新地址| 亚洲成人一二三区| 可以直接看的黄色网址| 手机免费av片| 伊人久久大香线蕉综合75| 国产成人精品亚洲精品| 日韩精品久久久久| 激情久久av一区av二区av三区| 国产精品系列在线观看| 在线亚洲欧美日韩| 国产免费嫩草影院| 国产又大又黄又粗的视频| 蜜桃在线一区二区三区精品| 高清视频欧美一级| 亚洲а∨天堂久久精品9966| 亚洲黄色录像片| 国产高清不卡一区| av免费在线不卡| 日本中文字幕免费在线观看| www.成人黄色| 久久久久久av无码免费网站下载| 亚洲在线视频观看| 久久6免费高清热精品| 日韩一区二区免费在线电影 | 欧美孕妇性xx| 亚洲欧美另类人妖| 欧美日韩在线三级| 亚洲欧美经典视频| 成人黄页在线观看| 亚洲欧美日韩综合在线| 亚洲 欧美 日韩 在线| 男人舔女人下部高潮全视频| 最新中文字幕免费视频| 欧美精品久久96人妻无码| 99在线看视频| 欧美资源在线观看| 最近2019中文字幕在线高清 | 精品久久中文字幕| 日本一区二区成人在线| 国产麻豆91精品| 欧美在线 | 亚洲| 国产三级av片| 97在线观看免费高| 日韩成人av一区二区| 五月婷婷激情久久| 成人免费在线网| 视频一区国产精品| 国产精品久久久久久久久久直播 | 久久精品影视大全| av日韩在线看| 神马影院我不卡| 肥熟一91porny丨九色丨| 秋霞午夜一区二区| 欧美激情一级二级| 在线日韩日本国产亚洲| 欧美mv日韩mv| 欧美日韩和欧美的一区二区| 亚洲一区二区三区中文字幕| 国产视频911| 国产成人免费av在线| 日韩高清一级片| 国产丰满果冻videossex| av网站中文字幕| 久久精品国产亚洲AV无码男同| 欧美一区二区三区粗大| 国产肉体xxxx裸体784大胆| 国产三级精品三级在线| 久久精品99国产| www精品久久| 可以在线看黄的网站| 日韩成人av电影在线| 久久66热这里只有精品| 成人9ⅰ免费影视网站| 国产免费亚洲高清| 国产激情视频一区| 国产99视频在线观看| 91精品国产自产91精品| 欧美极品在线播放| 欧美日韩爱爱视频| 久久久精品一区| 精品国产一区久久久| 一区二区欧美久久| 国产亚洲精品综合一区91| 日韩成人中文字幕| 日韩精品久久久久久福利| 亚洲精品99久久久久中文字幕| 欧美成人猛片aaaaaaa| 日韩欧美中文字幕制服| 日韩欧美国产麻豆| 亚洲成**性毛茸茸| 日韩精品免费在线播放| 亚洲精品成人久久| 亚洲开心激情网| 亚洲日本成人女熟在线观看| 亚洲欧洲日本专区| 日日骚av一区| 久久成人亚洲精品| 欧美精品一区三区| 韩国三级电影久久久久久| 992tv在线成人免费观看| 68精品久久久久久欧美| 国产91网红主播在线观看| 国产精品久久久久久超碰| 国产精品美女主播在线观看纯欲| 国产精品男人的天堂| 91精品国产综合久久香蕉922| 成人www视频在线观看| 亚洲自拍小视频免费观看| 99re在线视频上| 久久久久久久免费| 日韩电影大全在线观看| 精品一区二区成人免费视频 | 国产丝袜视频一区| 中文字幕久热精品在线视频| 久久夜精品香蕉| 91精品国产乱码久久久久久蜜臀 | 99精品一区二区三区的区别| 91免费国产精品| 男女午夜激情视频| 亚洲一区精品视频在线观看| 国产综合内射日韩久| 亚洲综合色一区| 爱爱视频免费在线观看| 欧美亚洲精品天堂| 国产乱码久久久久| 天堂av在线一区| 国产成人aaa| 国产校园另类小说区| 亚洲美女在线国产| 在线观看一区不卡| 精品美女在线播放| 日韩视频在线免费| 国产aaa精品| av免费精品一区二区三区| 日本在线观看一区二区| 国产免费一区二区视频| 亚洲欧美自偷自拍另类| 少妇户外露出[11p]| 日韩在线不卡av| av手机天堂网| 久久狠狠一本精品综合网| 高清久久久久久| 亚洲欧美日韩久久| 欧美视频一二三区| 亚洲欧美国产另类| 2019中文字幕全在线观看| dy888夜精品国产专区| 中文字幕精品—区二区日日骚| 99热成人精品热久久66| 亚洲av成人片色在线观看高潮| avtt天堂在线| 国产超碰人人模人人爽人人添| 麻豆国产精品一区二区三区| 国产视频一区二区三区在线观看| 天天综合网 天天综合色| 日韩三级高清在线| 色综合色综合久久综合频道88| 成人综合国产精品| 正在播放一区二区三区| 国产福利在线免费| 久久久精品少妇| 国产99视频在线| 国产成人在线免费| 一区二区三区免费观看| 日韩一级大片在线| 久久91精品国产91久久久| 亚洲在线免费看| 男女激情免费视频| 日本黄色免费观看| 亚洲欧美自拍视频| 日韩**一区毛片| 国产精品美女久久久久久久久 | 欧美日韩成人精品| 国产九区一区在线| 国产97在线 | 亚洲| 国产又爽又黄无码无遮挡在线观看| 亚洲男人第一av| 日本欧美韩国一区三区| 国产精品福利一区二区三区| 欧美裸体bbwbbwbbw| 欧美大胆a视频| 国产精品一区二区在线观看| 黄页网站在线观看视频| 免费看污黄网站在线观看| 无码人妻av一区二区三区波多野| 麻豆一区二区三区| 一区二区三区**美女毛片| 亚洲精品电影久久久| 日韩暖暖在线视频| 91xxx视频| 大尺度做爰床戏呻吟舒畅| 日韩精品久久久久久免费| 美女视频一区在线观看| 亚洲自拍另类综合| 亚洲欧美色婷婷| 国产精品视频一区二区三区四 | 视频二区一区| 免费欧美一级片| 三级网站在线播放| 国产91对白在线观看九色| 色88888久久久久久影院野外| 色阁综合伊人av| 国产乱子伦精品| 潘金莲激情呻吟欲求不满视频| 久草视频精品在线| 国产在线乱码一区二区三区| 黑人巨大精品欧美一区二区| www.久久久久久.com| 久久久久久久久久久久久久久久av | 97国产在线观看| 亚洲一卡二卡| 成人精品在线观看视频| 精品美女www爽爽爽视频| 国产精品午夜电影| 亚洲精品日韩欧美| 成人欧美一区二区三区在线观看 | 国产精品九色蝌蚪自拍| 日韩福利在线播放| 都市激情久久久久久久久久久| 国产女人aaa级久久久级| 刘亦菲久久免费一区二区| 日本免费在线精品| 亚洲视频图片小说| av中文字幕播放| 欧美xxxx精品| av观看免费在线| 国产在线欧美日韩| 欧美成人激情视频| 夜夜嗨av一区二区三区中文字幕| 久久综合九色| 国产精品入口麻豆| 国产成人免费av| 成人免费看黄yyy456| 国产又粗又猛又爽又黄的视频小说| 99免费在线视频观看| 天天操天天色综合| 亚洲 精品 综合 精品 自拍| 可以看毛片的网址| 日韩中文字幕视频| 成人精品小蝌蚪| 在线免费观看亚洲视频| 成年人三级黄色片| 婷婷久久五月天| 亚洲区中文字幕| 国产精品国产三级国产有无不卡| 在线免费看av的网站| 激情综合在线观看| 亚洲精品国精品久久99热| 91免费观看视频在线| 精品乱码一区内射人妻无码| 欧美污视频网站| 国产美女精品久久久| 国内精品久久久久| 一本一本久久a久久精品牛牛影视| 亚洲国产欧美另类丝袜| 国产精品系列在线| 天天操天天射天天| 波多野结衣二区三区| 在线免费观看视频| 九九热只有这里有精品| 超碰在线97av| 亚洲成人av片| 欧美极品少妇xxxxⅹ高跟鞋| 中文字幕在线观看你懂的| 日本成人在线免费视频| 精品一区2区三区| 日韩免费一区二区| 国产精品一区专区| 91精品国产乱码久久久张津瑜| 熟妇无码乱子成人精品| 国产欧美综合一区| 国产精品美乳在线观看| 亚洲人a成www在线影院| 亚洲乱码精品一二三四区日韩在线| 久久国产综合精品| 中文字幕伦理片| 久久国产精品久久精品国产| 久久人人爽国产| 欧美一区午夜视频在线观看| 亚洲一级片免费看| 欧美成人精品欧美一级乱黄| 国产精品jizz| 97人人模人人爽人人澡| 国产高清不卡无码视频| 91国产中文字幕| 精品欧美一区二区久久| 91麻豆国产精品久久| 欧美精品二区三区| www.88av| 欧美韩国日本在线| 国产精品www色诱视频| 日韩欧美一区二区三区在线| 国产成人精品亚洲777人妖| 精品国产亚洲一区二区麻豆| 中文字幕乱伦视频| 999精品国产| 全网免费在线播放视频入口| 欧美精品性生活| 99高清视频有精品视频| 国产成人在线一区| 亚洲免费影视第一页| 成人激情校园春色| 久久精品午夜| 91午夜交换视频| 日韩欧美视频在线免费观看| 最新中文字幕在线观看视频| 国产农村妇女毛片精品| 免费不卡在线视频| 国产精品一色哟哟哟| 欧美国产精品一区| 亚洲成a人片在线不卡一二三区| 亚洲综合一区二区精品导航| 精品久久久久久久久久久| 欧美日韩国产精品专区| 天天色天天操综合| 久久久久久免费网| 懂色av一区二区三区蜜臀| 国产视频在线一区| 国产精品一二三四五区| 成人免费精品动漫网站| 谁有免费的黄色网址| 国产亚洲精品熟女国产成人| 欧美一区二区三区成人精品| 999一区二区三区| 日本女人高潮视频| 国产精品我不卡| 国产精品午夜一区二区欲梦| 国产精品网红福利| 亚洲影院污污.| 欧美一级黄色网| 亚洲成色999久久网站| 欧美一区二区大片| 精品国产一区二区三区久久久蜜月| 欧美一卡二卡三卡| 色欧美88888久久久久久影院| jiyouzz国产精品久久| 国产91精品入口| 奇米四色…亚洲| 久久99精品国产麻豆不卡| 国产亚洲精品中文字幕| 亚洲成av人片| 日韩精品最新网址| 日本高清视频精品| 亚洲电影网站| 国产又粗又猛大又黄又爽| 2018天天弄| 国产老妇伦国产熟女老妇视频| 亚洲 欧美 精品| 91麻豆国产香蕉久久精品| 91免费观看在线| 国产欧美一二三区| 狠狠色香婷婷久久亚洲精品| 一道本成人在线| 欧美色视频在线观看| 亚洲国产精品一区二区三区| 亚洲裸体xxxx| 久久av.com| 91成人在线视频| 久久免费高清视频| 国模私拍一区二区三区| 欧美在线日韩在线| 国产啪精品视频网站| 444亚洲人体| 在线不卡日本| 丁香婷婷激情网| 国产手机在线视频| 国产乱人乱偷精品视频|