簡體   English   中英

C++ 和 Python 之間的簡單 IPC(跨平台)

[英]Simple IPC between C++ and Python (cross platform)

我有一個在后台運行的 C++ 進程,它很少會生成“事件”,而在同一台機器上運行的 Python 進程需要接收這些“事件”。

  • C 端的代碼需要盡可能輕量級。
  • Python 端是只讀的。
  • 實現必須是跨平台的。
  • 發送的數據非常簡單。

我有哪些選擇?

謝謝

zeromq - 沒有別的。 將消息編碼為字符串。

但是,如果您想從庫中獲得序列化,請使用protobuf ,它將為 Python 和 C++ 生成類。 您在任一端使用 SerializeToString() 和 ParseFromString() 函數,然后通過 ZeroMq 管道傳輸字符串。

問題解決了,因為我懷疑任何其他解決方案都更快,而且任何其他解決方案都不會那么容易連接和易於理解。

如果要為 rpc 使用特定的系統原語,例如 Windows 上的命名管道和 unix 上的 Unix 域套接字,那么您應該查看Boost::ASIO 但是,除非您具有 (a) 網絡背景,並且 (b) 對 C++ 非常了解,否則這將非常耗時

Google 的protobuf是一個很棒的程序間 RPC 庫。 它為PythonC++生成綁定。

如果您需要分布式消息傳遞系統,您還可以使用RabbitMQzeromqActiveMQ 之類的東西 有關消息隊列庫的討論,請參閱此問題

使用zeromq ,它就像你能得到的一樣簡單。

另一種選擇是使用ctypes模塊從 Python 代碼中調用 C 代碼,而不是分別運行這兩個程序。

您的數據有多復雜? 如果它很簡單,我會將其序列化為字符串。 如果它比較復雜,我會使用 JSON。 TCP 是一種很好的跨平台 IPC 傳輸。 既然你說這個IPC很少見,性能不是很重要,TCP+JSON就可以了。

您可以為此使用 Google GRPC

我會說你創建了一個 DLL 來管理兩者之間的通信。 python 將加載 DLL 並調用 getData() 等方法,DLL 將依次與進程通信並獲取數據。 那應該不難。 您也可以使用 XML 文件或 SQLite 數據庫或任何數據庫來查詢數據。 守護進程將更新數據庫,Python 將繼續查詢。 可能有一個字段用於指示數據庫中的數據是否已被守護程序更新,然后 Python 將進行查詢。 當然這取決於性能和精度因素!

暫無
暫無

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

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