簡體   English   中英

如何解決這個簡單的單向本地機器消息傳遞問題

[英]How to solve this simple one-way local machine messaging problem

我在 Python 3.10 中有一個第一個發送者腳本,它需要發送一些數據

def post_updates(*args):
   sender.send_message("optional_key", args)

然后是 Python 3.7 中的第二個接收腳本,它需要接收此數據

while True:
   args = receiver.get_message("optional_key", blocking=True)
   print("args received:", args)

約束:

  • 每個腳本不應依賴於另一個腳本的存在來運行。
  • 無論接收方是否正在運行,發送方都應嘗試發送。
  • 無論發送方是否正在運行,接收方都應嘗試接收。
  • 該消息可以由基本的 Python 對象(字典、列表)組成,並且應該自動序列化。
  • 我需要每秒發送超過 100 條消息(盡可能減少延遲)。
  • 僅限本地 PC (Windows),無需安全措施。

這個簡單問題是否有 1-liner 解決方案? 我查找的所有內容似乎都過於復雜或需要事先啟動 TCP 服務器。 我不介意安裝流行的模塊。

UDP 和 JSON 看起來非常適合您的要求,只要

  • 你不需要有一個以上的接收器
  • 你不需要非常大的消息
  • 你只需要發送字典、列表、字符串和數字的組合,而不是任意類的 Python 對象
  • 關於尋找“1-liner”,您並不過分直截了當:編寫的代碼量非常少,而且您可以自由定義自己的輔助函數。

Python 的標准庫擁有您需要的一切。 從 JSON 編碼和解碼就像json.dumps()json.loads()一樣簡單。 對於發送和接收,我建議遵循Python wiki 上的示例 您需要先創建套接字

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

無論您是發送者還是接收者。 接收者然后需要綁定到本地端口來收聽它:

sock.bind(('127.0.0.1', PORT))

然后發送方使用sock.sendto()發送,接收方使用sock.recvfrom() () 接收。

好的舊管道可能會完成這項工作,但您需要評估需要多大的緩沖區大小(考慮到發送方/接收方的異步性質),並更改默認的管道緩沖區大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM