進程間通信-Queue
由於進程間不共享數據,通信間使用Socket和Queue通信。通信不只是發送接收消息,還能實現數據的上傳與下載。
socket與queue之間的不同:socket不只是能單機之間通信,還可以實現網路之間的多台電腦之間的通信。queue隊列通信先近先出。
本文就文件上的數據傳遞作為進程間的數據共享作為案例。
importmultiprocessing
defread(file_name,queue):
try:
file =open(file_name,"rb")
content = file.read()
queue.put(content)
exceptException:
pass
defwrite(file_name,queue):
print(queue.empty())
if notqueue.empty():
withopen("[復件]"+file_name,"wb")asfile:
file.write(queue.get(True))
print("寫入成功。")
else:
print("請求文件不存在")
defmain():
queue = multiprocessing.Queue()
file_name =input("請輸入文件名稱:")
p1 = multiprocessing.Process(target=read,
args=(file_name,queue))
p2 = multiprocessing.Process(target=write,
args=(file_name,queue))
p1.start()
p1.join()
p2.start()
if__name__ =="__main__":
main()
importsocket
importmultiprocessing
defwrite(file_name):
"""文件的讀取並發送"""
client_tcp_socket = socket.socket(
socket.AF_INET,socket.SOCK_STREAM)
client_tcp_socket.connect(("",
8080))#創建客戶端的socket
try:
content =open(file_name,"rb")
txt = content.read()
client_tcp_socket.send(txt)
content.close()
exceptException:
print("你請求的文件不存在。")
finally:
client_tcp_socket.close()
defmain():
"""本文最初想法是,新建兩個子進程,
一個子進程負責獲取要拷貝的文件內容,
發送給另一個子進程,另一個子進程負責接收,
並新建文件保存接收到了拷貝的內容。
主進程先建立一個伺服器tcp套接字,
使其處於監聽狀態,再新建一個客戶端伺服器,
鏈接到伺服器,將兩個socket分別作為參數傳
遞給兩個進程,進行操作。最後關閉套接
字,錯在不能將套接字作為參數傳遞給子進程"""
file_name =input("請輸入要拷貝的文件:")
server_tcp_socket = socket.socket(
socket.AF_INET,socket.SOCK_STREAM)
server_tcp_socket.bind(("",8080))
server_tcp_socket.listen(128)
#創建伺服器的socket,進入監聽狀態
p1 = multiprocessing.Process(target=write,
args=(file_name,))
p1.start()
p1.join()
new_tcp_socket,client_add =
server_tcp_socket.accept()
data = new_tcp_socket.recv(1024)
ifdata:
withopen("[復件]"+file_name,"wb")
asfile:
#數據寫入
file.write(data)
print("拷貝成功。")
else:
print("拷貝失敗。")
new_tcp_socket.close()
server_tcp_socket.close()
if__name__ =="__main__":
main()
有什麼錯誤,希望大神能給指出,交流下,大家共同進步。
TAG:PythonKnowledge |