我需要用unix連接兩個進程sockets:一個流式傳輸視頻的生產者,一個應該讀取視頻并進行處理的消費者。
由于視頻流來自實時流,我最初考慮使用生產者進程將數據連續寫入套接字,然后消費者在準備好后開始消費。
然而,我無法用AF_UNIX
sockets實現此行為,因為我無法在接收套接字存在之前啟動發送器。這真的可以實現嗎?
我想到的這種non-blocking發送行為可以通過AF_INET
sockets(即UDP通信)來實現,在這種情況下,生產者可以連續寫入,讀者可以根據自己的意愿開始消費。以下是此功能的示例python代碼:發件人可以啟動,它將立即開始發送消息;然后可以在需要時啟動接收器。
# sender.py
import socket
import time
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('localhost', 10000)
try:
# Send data
i = 0
while True:
msg = f"message: {i}"
sent = sock.sendto(bytes(msg, encoding="ascii"), server_address)
print(f"sent {sent} bytes - {msg}")
i += 1
time.sleep(0.05)
finally:
print('closing socket')
sock.close()
# receiver.py
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('localhost', 10000)
sock.bind(server_address)
try:
while True:
data, address = sock.recvfrom(4 * 1024)
print(f"received {data}")
except KeyboardInterrupt:
pass
finally:
sock.close()
UNIX域sockets是可靠的sockets,即使使用SOCK_DGRAM也是如此。只有當有人在另一端閱讀時,才能實現這種可靠性。
與此UDP相反的是“開火并忘記”,即不關心成功傳遞、消息順序或重復消息。