Python的程序間通訊

2022-03-02 23:59:50 字數 2897 閱讀 2576

程序間通訊有多種方式,包括訊號,管道,訊息佇列,訊號量,共享記憶體,socket等

1.共享記憶體

python可以通過mmap模組實現程序之間的共享記憶體

mmap檔案物件既像乙個字串也像乙個普通檔案物件。像字串時因為我們可以改變其中的單個字元,如,obj[index] = 'a',同時我們也可以改變一小段的字元,如 obj[2:5]='aaa'。像檔案物件是因為在mmap中會有操作標記,我們可以使用seek()方法來改變mmap物件的操作標記

mmap物件通過mmap()方法來構建,windows系統和unix系統下,構建方法是不同的。

window的構造方法:

mmap.

mmap

(]]])

mmap.

mmap

(]]]])

mmap.

close

() 關閉物件

mmap.

find

(string[, start[, end]])   在共享記憶體中查詢內容,返回匹配內容最小的操作標記

mmap.

flush

([offset, size])  把記憶體的資料儲存到硬碟中

mmap.

move

(dest, src, count) 移動操作標記

mmap.

read

(num)  從操作標記開始讀取num個長度的字元

mmap.

read_byte

()  讀取二進位制資料

mmap.

readline

()   讀取一行資料

mmap.

resize

(newsize)  修改mmap的長度

mmap.

rfind

(string[, start[, end]])   在共享記憶體中查詢內容,返回匹配內容最大的操作標記

mmap.

seek

(pos[, whence])  移動操作標記

mmap.

size

()  返回mmap物件的長度

mmap.

tell

()  返回當前操作標記的位置

mmap.

write

(string)  寫入內容.

mmap.

write_byte

(byte)  寫入二進位制內容

share_file='

/tmp/mm.txt

'f = open(share_file, 'wb'

)f.write('a

' *share_size)

f.close()

f = open(share_file, '

r+b'

)mm =mmap.mmap(f.fileno(), 0)

f.close()

因為mmap物件的長度不能大於檔案的長度,不然會報錯:valueerror: mmap offset is greater than file siz

所以需要以wb的形式,先開啟共享的檔案,然後寫入需要共享記憶體的長度的內容,關閉檔案後以r+b方式開啟檔案,然後構造mmap物件。

當然,下次就可以直接用r+b的方式開啟檔案,然後構造物件了

參考:2.訊號

訊號(signal)--     程序之間通訊的方式。乙個程序一旦接收到訊號就會打斷原來的程式執行流程來處理訊號。

幾個常用訊號:

sigint     終止程序  中斷程序  (control+c)

sigterm   終止程序     軟體終止訊號

sigkill   終止程序     殺死程序

sigalrm 鬧鐘訊號

相對於共享記憶體,訊號更加偏向於系統層面的,linux系統也是通過訊號來管理程序,而且系統也規定了某些程序接到某些訊號後的行為。

當然我們可以通過繫結訊號處理函式來修改程序收到訊號以後的行為

#

encoding=utf-8

import

osimport

signal

from time import

sleep

defmy_term(a,b):

print

"收到sigterm訊號

"signal.signal(signal.sigterm,my_term)

defmy_usr1(a,b):

print

"收到sigusr1訊號

"signal.signal(signal.sigusr1,my_usr1)

while 1:

print

"我是程序id是

",os.getpid()

sleep(1)

可以通過os.kill(pid,訊號)來主動傳送訊號

3.通過queue

__author__ = '

lujianxing

'import

threading

from time import

sleep

deff(q,t):

q.put(t)

from multiprocessing import

process,queue

if__name__ == '

__main__':

q=queue()

p = process(target=f, args=(q,'

ljx.sa'))

p.start()

p.join()

p1 = process(target=f, args=(q,'

ljx.elex'))

p1.start()

p1.join()

print q.qsize()

Python多程序 程序間通訊

1.使用multiprocessing模組建立的程序之間的通訊 coding utf 8 queue類常用屬性和方法 init self,maxsize 1 qsize full empty put obj,block true,timeout none put nowait obj get blo...

Python基礎 程序間通訊

程序間通訊 windows下程序間通訊有很多種,例如 訊息佇列 共享記憶體 管道等等。python的multiprocessing模組包裝了底層的機制,提供了queue pipes等多種方式來交換資料。multiprocessing.pipe 即管道模式,呼叫pipe 返回管道的兩端的connect...

python中程序間通訊

程序間通訊 磁碟互動 速度慢 不安全 socket 本地套接字 管道 訊息列隊 共享記憶體 訊號 訊號量 套接字 管道通訊 pipe 在記憶體中開闢一塊空間,對多個程序可見,通過管道 多個程序進行通訊 multiprocessing pipe fd1,fd2 pipe duplex true 功能 ...