程序間通訊 1 傳遞函式的方法

2022-02-20 17:08:52 字數 3447 閱讀 5769

1. 不同程序間記憶體是不共享的,要想實現兩個程序間的資料交換,可以用下面的方法。

2. 執行緒queue, 用於同一主程式下的不同執行緒之間的互相訪問,(生產者消費者模型)。出了這個程序以後,就沒法訪問了。匯入方法:import queue;定義方法 q=queue.queue( )

3. 程序queue,匯入方法from multiprocessing import queue, 定義方法: q=queue( )

4. 主線程與子執行緒之間是可以互相訪問記憶體的。主線程中生成了乙個佇列,子執行緒可以往佇列裡放元素,主線程可以訪問到佇列裡所放的物件。

執行緒之間的資料共享。

from multiprocessing import process #主線程和子執行緒的記憶體是共享的。

import threading #匯入執行緒

import queue #匯入佇列模組

def f():

q.put([42, none, 'hello']) #子執行緒往佇列裡面放了乙個資料

if __name__ == '__main__':

q = queue.queue() #主線程定義了乙個佇列

p=threading.thread(target=f,) #生成乙個子執行緒,指明函式入口為f

p.start()

p.join()

print(q.get())  # 父執行緒去訪問這個資料

執行結果:

[42, none, 'hello']
5. 程序間的資料,無法相互訪問。子程序與父程序的記憶體是相互獨立的。

from multiprocessing import process #主線程和子執行緒的記憶體是共享的。

import threading

import queue

def f():

q.put([42, none, 'hello']) #子程序無法訪問主程序裡面定義的佇列

if __name__ == '__main__':

q = queue.queue() #主程序定義了乙個佇列

#p=threading.thread(target=f,) #生成乙個子執行緒

p=process(target=f,) #主程序生成乙個子程序

p.start()

p.join()

print(q.get()) # 父程序去訪問這個資料

執行結果:

process process-1:

traceback (most recent call last):

file "multiprocessing\process.py", line 249, in _bootstrap

file "multiprocessing\process.py", line 93, in run

file "c:\abccdxddd\oldboy\py_exercise\day10\ex2.py", line 6, in f

q.put([42, none, 'hello']) #子程序無法訪問主程序裡面定義的佇列

nameerror: name 'q' is not defined

6.那麼,程序間如果要相互訪問,該怎麼辦呢?執行緒queue無法傳給程序,程序queue才能傳給程序。(因為程序queue的傳遞有乙個pickle序列化的過程,而執行緒queue 沒有)

from multiprocessing import process #主線程和子執行緒的記憶體是共享的。

import threading

import queue

def f(qq):

qq.put([42, none, 'hello']) #子執行緒往佇列裡面放了乙個資料

if __name__ == '__main__':

q = queue.queue() #主線程定義了乙個佇列

p=process(target=f,args=(q,)) #生成乙個子程序,並且把主程序裡面定義的佇列傳給子程序。

p.start()

p.join()

print(qq.get()) # 父執行緒去訪問這個資料

執行結果:

c:\abccdxddd\oldboy\python-3.5.2-embed-amd64\python.exe c:/abccdxddd/oldboy/py_exercise/day10/ex2.py

traceback (most recent call last):

file "c:/abccdxddd/oldboy/py_exercise/day10/ex2.py", line 11, in p.start()

file "multiprocessing\process.py", line 105, in start

file "multiprocessing\context.py", line 212, in _popen

file "multiprocessing\context.py", line 313, in _popen

file "multiprocessing\popen_spawn_win32.py", line 66, in __init__

file "multiprocessing\reduction.py", line 59, in dump

typeerror: can't pickle _thread.lock objects

7.用程序queue()把父程序的queue傳給了子程序。相當於父程序把queue 轉殖了乙份,傳給了子程序。是兩個獨立的queue。

為了要實現兩個queue裡面的資料的同步,把子程序裡面放的資料序列化了,放到乙個中間位置,然後再反序列化傳給

父程序。兩個程序之間是無法直接訪問各自的記憶體位址的。雖然看上去是乙個共享queue,但實際上有pickle的過程,還有乙個中間容器。

只是實現了程序間資料的傳遞,還沒有實現同時修改乙份資料。

from multiprocessing import process,queue #主線程和子執行緒的記憶體是共享的。

import threading

def f(qq):

qq.put([42, none, 'hello']) #子程序往佇列裡面放了乙個資料

if __name__ == '__main__':

q = queue() #主程序定義了乙個佇列

p=process(target=f,args=(q,)) #生成乙個子程序,並且把主程序裡面定義的佇列傳給子程序。

p.start()

p.join()

print(q.get()) # 父程序去訪問這個資料

執行結果:

程序間通訊1

管道由於傳遞資料只能單向傳遞,因此又稱半雙工管道,它是一種兩個程序間進行單向通訊的機制 侷限性 資料只能由乙個程序流向另乙個程序,若要進行全雙工通訊,則需建立兩個管道 管道只能用於具有親緣關係的程序間通訊 管道無名字 管道的緩衝區大小受限制 管道所傳遞的是無格式的位元組流,這就要求管道的輸入和輸出事...

程序間通訊1

管道通訊 管道是單向 先進先出的,他把乙個程序的輸出和另乙個程序的輸入連在一起。兩個程式之間傳遞資料的一種簡單方法是使用popen和pclose。include file popen const char command,const char type int pclose file stream ...

程序間的通訊(1)

根據程序間通訊資訊量的不同,劃分為兩個類別 控制資訊的通訊 低階通訊 和大批量資料資訊的通訊 高階通訊 常見的通訊介面有 用於實現低階通訊的有軟中斷訊號 訊號量集,實現高階通訊的有管道 訊息佇列 共享記憶體等。軟中斷訊號 是作業系統用來通知程序有事件發生的一種訊號機制,用於實現簡單的非同步通訊的一些...