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:6.那麼,程序間如果要相互訪問,該怎麼辦呢?執行緒queue無法傳給程序,程序queue才能傳給程序。(因為程序queue的傳遞有乙個pickle序列化的過程,而執行緒queue 沒有)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
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.py7.用程序queue()把父程序的queue傳給了子程序。相當於父程序把queue 轉殖了乙份,傳給了子程序。是兩個獨立的queue。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
為了要實現兩個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)
根據程序間通訊資訊量的不同,劃分為兩個類別 控制資訊的通訊 低階通訊 和大批量資料資訊的通訊 高階通訊 常見的通訊介面有 用於實現低階通訊的有軟中斷訊號 訊號量集,實現高階通訊的有管道 訊息佇列 共享記憶體等。軟中斷訊號 是作業系統用來通知程序有事件發生的一種訊號機制,用於實現簡單的非同步通訊的一些...