2016-02-26 12 views
5

Tôi có 2 cơ sở mã, một trong python, một trong C++. Tôi muốn chia sẻ dữ liệu thời gian thực giữa chúng. Tôi cố gắng để đánh giá mà lựa chọn sẽ làm việc tốt nhất cho trường hợp sử dụng cụ thể của tôi:Chia sẻ thông tin giữa mã python và mã C++ (IPC)

  • nhiều cập nhật dữ liệu nhỏ từ chương trình C++ cho chương trình python
  • cả hai đều chạy trên cùng một máy
  • độ tin cậy là điều quan trọng
  • độ trễ thấp là tốt đẹp để có

tôi có thể thấy một vài lựa chọn:

  • Một quy trình ghi vào một tệp phẳng, quy trình khác đọc nó. Nó không dễ bị lỗi, chậm và I/O.
  • Một quy trình ghi vào cơ sở dữ liệu, quy trình khác đọc nó. Điều này làm cho nó dễ mở rộng hơn, ít bị lỗi hơn, nhưng vẫn rất chậm.
  • Nhúng chương trình python của tôi vào C++ một hoặc vòng khác. Tôi đã từ chối giải pháp đó vì cả hai cơ sở mã đều phức tạp và tôi muốn giữ chúng tách biệt vì lý do bảo trì.
  • Tôi sử dụng một số ổ cắm trong cả hai chương trình và gửi tin nhắn trực tiếp. Điều này có vẻ là một cách tiếp cận hợp lý, nhưng không tận dụng thực tế rằng họ đang ở trên cùng một máy (nó sẽ được tối ưu hóa một chút bằng cách sử dụng máy chủ cục bộ làm đích, nhưng vẫn cảm thấy cồng kềnh).
  • Sử dụng bộ nhớ dùng chung. Cho đến nay tôi nghĩ rằng đây là giải pháp thỏa mãn nhất mà tôi đã tìm thấy, nhưng có nhược điểm là hơi phức tạp hơn để thực hiện.

Có các giải pháp nào khác mà tôi nên cân nhắc không?

+0

Trực tiếp sử dụng mã Python/C++ từ C++/Python? –

+0

RESTful API sẽ giúp bạn nhiều nhất, một ngôn ngữ hoàn hảo độc lập api – AlokThakur

+0

@Revolver_Ocelot, tôi sở hữu 2 cơ sở mã, vì vậy có tôi có thể sử dụng mã trực tiếp trong mỗi. – DevShark

Trả lời

1

Trước hết, câu hỏi này rất dựa trên ý kiến!

Cách sạch sẽ nhất là sử dụng chúng trong cùng một quy trình và giúp họ liên lạc trực tiếp. Sự phức tạp duy nhất là thực hiện các API và C++ -> các cuộc gọi Python thích hợp. Nhược điểm là khả năng bảo trì như bạn đã chú ý và có khả năng thấp hơn (cả hai đều gặp sự cố, không phải là vấn đề trong hầu hết các trường hợp) và tính linh hoạt thấp hơn (bạn có chắc bạn sẽ không bao giờ cần chạy chúng trên các máy khác nhau không?). Khả năng mở rộng là tốt nhất vì nó rất đơn giản để thêm giao tiếp nhiều hơn hoặc để thay đổi hiện có. Bạn có thể xem xét lại điểm bảo trì. Bạn có thể sử dụng ứng dụng python w/o đối tác C++ không? Nếu không, tôi sẽ không lo lắng về khả năng bảo trì quá nhiều.

Sau đó, bộ nhớ dùng chung là lựa chọn tiếp theo với khả năng bảo trì tốt hơn nhưng cùng các nhược điểm khác. Khả năng mở rộng là một chút tồi tệ hơn nhưng vẫn không quá tệ. Nó có thể phức tạp, tôi không biết hỗ trợ Python cho hoạt động bộ nhớ chia sẻ, cho C++ bạn có thể có một cái nhìn tại Boost.Interprocess. Câu hỏi chính tôi muốn kiểm tra đầu tiên là đồng bộ giữa các quá trình.

Sau đó, liên lạc mạng. Rất nhiều lựa chọn ở đây, từ giao thức nhị phân đơn giản nhất có thể được triển khai trên cấp độ socket đến các tùy chọn cấp cao hơn được đề cập trong các nhận xét. Nó phụ thuộc vào sự phức tạp của C++ < -> Giao tiếp Python là và có thể trong tương lai. Cách tiếp cận này có thể phức tạp hơn để triển khai, có thể yêu cầu thư viện của bên thứ ba nhưng một khi đã hoàn thành, nó có thể mở rộng và linh hoạt. Thông thường các thư viện của bên thứ ba dựa trên việc tạo mã (Thrift, Protobuf) không đơn giản hóa quá trình xây dựng của bạn.

Tôi sẽ không nghiêm túc xem xét hệ thống tệp hoặc cơ sở dữ liệu cho trường hợp này.

+0

"API thích hợp" trong trường hợp này là gì? Tôi không hiểu. Chúng là các ứng dụng riêng biệt. – Andrey

+0

Tôi có nghĩa là một API mà bạn muốn gọi từ phía C++, nó có thể là bất cứ điều gì bạn cần, nhưng tốt hơn để giữ nó ở một nơi duy nhất, một cái gì đó giống như mô hình mặt tiền (https://en.wikipedia.org/wiki/ Facade_pattern), để bảo trì không đau. API như vậy sẽ không sao nếu bạn chọn tùy chọn nào. –

Các vấn đề liên quan