python進(jìn)程間通信的方式 進(jìn)程間通信,內(nèi)存映射和共享內(nèi)存的區(qū)別?
進(jìn)程間通信,內(nèi)存映射和共享內(nèi)存的區(qū)別?內(nèi)存映射文件是利用虛擬內(nèi)存把文件映射到進(jìn)程的地址空間中去,在此之后進(jìn)程操作文件,就像操作進(jìn)程空間里的地址一樣了,比如使用c語言的memcpy等內(nèi)存操作的函數(shù)。這種
進(jìn)程間通信,內(nèi)存映射和共享內(nèi)存的區(qū)別?
內(nèi)存映射文件是利用虛擬內(nèi)存把文件映射到進(jìn)程的地址空間中去,在此之后進(jìn)程操作文件,就像操作進(jìn)程空間里的地址一樣了,比如使用c語言的memcpy等內(nèi)存操作的函數(shù)。這種方法能夠很好的應(yīng)用在需要頻繁處理一個文件或者是一個大文件的場合,這種方式處理IO效率比普通IO效率要高
共享內(nèi)存是內(nèi)存映射文件的一種特殊情況,內(nèi)存映射的是一塊內(nèi)存,而非磁盤上的文件。共享內(nèi)存的主語是進(jìn)程(Process),操作系統(tǒng)默認(rèn)會給每一個進(jìn)程分配一個內(nèi)存空間,每一個進(jìn)程只允許訪問操作系統(tǒng)分配給它的哪一段內(nèi)存,而不能訪問其他進(jìn)程的。而有時候需要在不同進(jìn)程之間訪問同一段內(nèi)存,怎么辦呢?操作系統(tǒng)給出了創(chuàng)建訪問共享內(nèi)存的API,需要共享內(nèi)存的進(jìn)程可以通過這一組定義好的API來訪問多個進(jìn)程之間共有的內(nèi)存,各個進(jìn)程訪問這一段內(nèi)存就像訪問一個硬盤上的文件一樣。而.Net 4.0中引入了System.IO. MemoryMappedFiles命名空間,這個命名空間的類對windows 共享內(nèi)存相關(guān)API做了封裝,使.Net程序員可以更方便的使用內(nèi)存映射文件。
Python有沒有和C/C 進(jìn)程共享內(nèi)存的方式?
進(jìn)程傳遞數(shù)據(jù)最簡單方便的是通過Queue。這樣你的自建類對象就可以放到隊(duì)列中,由子進(jìn)程獲取。 到于Array, Var等方法,那是給高效數(shù)據(jù)共享用的。共享內(nèi)存是進(jìn)程通信的高級技巧。需要高性能計(jì)算的時候再研究這些方法。 Pool, Manager之類是一種封裝。用得反而比較少。 python與C 共享內(nèi)存里,還會使用一種Numpy中的數(shù)組。那個效率更高。 你的程序中子進(jìn)程及傳遞參數(shù)都沒有問題。你少了一句。在后面要加上p.join()就可以了 如果不加,那么你的主進(jìn)程不等子進(jìn)程,它先退出了,往往操作系統(tǒng)會自動把子進(jìn)程也殺掉。 另外子進(jìn)程中的print輸出有延時。即使你用sys.stdout.flush(),有時候它也會有延時。
linux兩個進(jìn)程間共享內(nèi)存通信都需要調(diào)用shmget函數(shù)么?
第一個參數(shù),shm_id是由shmget函數(shù)返回的共享內(nèi)存標(biāo)識。第二個參數(shù),shm_addr指定共享內(nèi)存連接到當(dāng)前進(jìn)程中的地址位置,通常為空,表示讓系統(tǒng)來選擇共享內(nèi)存的地址。第三個參數(shù),shm_flg是一組標(biāo)志位,通常為0。調(diào)用成功時返回一個指向共享內(nèi)存第一個字節(jié)的指針,如果調(diào)用失敗返回-1.
進(jìn)程間通信是怎么回事?
傳統(tǒng)的進(jìn)程間通信的方式有大致如下幾種:(1)管道(PIPE)(2)命名管道(FIFO)(3)信號量(Semphore)(4)消息隊(duì)列(MessageQueue)(5)共享內(nèi)存(SharedMemory)(6)SocketJava如何支持進(jìn)程間通信。我們把Java進(jìn)程理解為JVM進(jìn)程。很明顯,傳統(tǒng)的這些大部分技術(shù)是無法被我們的應(yīng)用程序利用了(這些進(jìn)程間通信都是靠系統(tǒng)調(diào)用來實(shí)現(xiàn)的)。但是Java也有很多方法可以進(jìn)行進(jìn)程間通信的。除了上面提到的Socket之外,當(dāng)然首選的IPC可以使用Rmi,或者Corba也可以。另外Javanio的MappedByteBuffer也可以通過內(nèi)存映射文件來實(shí)現(xiàn)進(jìn)程間通信(共享內(nèi)存)。