這幾天,由于工作原因,需要将一個php寫的背景程式重串行執行改成并行執行。這樣必然涉及到多線程/多程序相關技術。PHP貌似沒有成熟的多線程機制,而有相對成熟的多程序機制。多程序程式設計,必然涉及到IPC(Inter-Process Communication)。PHP的IPC技術還是相當多的,可以在php源代碼目錄下(PHP_SRC/ext)看到sysvshm,sysvsem,sysvmsg,shmop等擴充,這些都可以用于IPC,下面簡單介紹一下:
pcntl - 提供程序相關操作函數
sysvsem - 信号量,全稱為system V semphore,可以用于限制通路共享資源的程序數目,一般設定為1,當作互斥鎖使用
sysvshm - 共享記憶體,全稱system V shared memory,用于提供共享記憶體機制,特點是省去了客戶代碼序列化和反序列化的麻煩,變量級别的通路控制,十分好用,屬于菜鳥使用的方式。
shmop - 共享記憶體操作擴充,與sysvshm的差別在于是比特級别的控制,需要手動序列化和反序列化,但是如果緊缺使用,記憶體使用率比sysvshm高,屬于高手進階方式。
下面是使用sysvsem的列子,作為備忘,具體的内容參見代碼,這裡隻提出幾個關鍵需要注意的地方:
shm_attach和sem_get的方法的key需要與主程序ID關聯,避免兩個元件同時運作打攪,因為共享記憶體和信号量是系統級别的資源,程序之間會公用,如果不處理,會導緻多個執行個體之間出現混亂。
父程序在等待子程序時,忙等會消耗大量CPU,采用sleep的方式,可以避免忙等。
父程序等待子程序最好有逾時機制,避免無限制等待
子程序邏輯必須在規定的地方退出,不能執行父程序的代碼,否則會混亂。常見的方式是用try catch包裹子程序的邏輯,抓到異常後,退出。
<a></a>
相關資料
<b>聲明:如有轉載本博文章,請注明出處。您的支援是我的動力!文章部分内容來自網際網路,本人不負任何法律責任。</b>
<b></b>
<b>本文轉自bourneli部落格園部落格,原文連結:</b><b>http://www.cnblogs.com/bourneli/archive/2012/08/03/2622131.html</b><b>,如需轉載請自行聯系原作者</b>