2013-05-28 25 views
5

Tôi muốn viết một daemon trong C++, sẽ giữ một cấu trúc dữ liệu đồ thị và sẽ tính toán một số phụ thuộc. Tôi cũng muốn có Python Batch (cũng là một daemon - một phụ trợ cho HTML dựa trên GUI), cho phép người dùng tương tác hoạt động trên các cấu trúc C++ này - thêm/xóa/kết nối/... nút và đọc kết quả tính toán.Python <-> C++ giao tiếp hướng đối tượng

Tôi rất muốn chọn cơ chế giao tiếp tốt nhất hiện có.

Các chức năng bắt buộc là:

  1. Python và C++ sẽ có thể hoạt động trên các nút theo cách hướng đối tượng, vì vậy tôi rất thích để có thể viết mã như n1 = node('a'); n2 = n1.add_subnode('b'); n2.ports('test').connect(node('c'))
  2. Các Python hàng loạt không phải được "tách biệt" khỏi trình nền C++ - chúng có thể có cùng tuổi thọ (nhưng sẽ tốt cho việc phân tách hàng loạt từ C++ daemon trong trường hợp lỗi C++ hoặc lỗi gì đó - việc tách này là tùy chọn)
  3. Giao tiếp nên được nhanh chóng - Python sẽ có thể nhận được thông tin về rất nhiều nút và cho phép người dùng cuối làm việc suôn sẻ càng nhiều càng tốt.

Hiện nay tôi đã suy nghĩ về:

  1. IPC (như 0MQ) với một số loại cơ chế dữ liệu tuần tự.
  2. RPC dựa trên Protocol Buffers hoặc Thrift.
  3. tích hợp dựa trên Boost.Python

IPC và các giải pháp RPC có vẻ tốt, nhưng tôi phải viết một giấy gói lớn để có được những chức năng từ điểm 1. Mặt khác tôi đã không tìm thấy thông tin về việc sử dụng Boost. Python trong C++ daemon và tôi không biết nếu nó thậm chí có thể.

Trả lời

4
  1. Boost.Python có thể được sử dụng trong daemon.

  2. Bộ đệm tiết kiệm và giao thức hoạt động tốt. Tiết kiệm thực hiện một máy chủ RPC đầy đủ trong khi protobuf, trừ khi tình hình đã thay đổi năm ngoái, chỉ cung cấp tuần tự hóa. Cá nhân tôi thích Thrift.

Sự khác biệt giữa hai giải pháp này là tốc độ (Boost.Python chắc chắn là nhanh hơn, mặc dù RPC là không thực sự chậm nếu bạn chỉ định tùy chọn ổ cắm đúng - TCP_NODELAY vv) và thực tế là trong trường hợp của Boost. Python nhị phân của bạn phụ thuộc vào một phiên bản nhất định của Python. Trong trường hợp tiết kiệm, bạn có ít phụ thuộc hơn, đặc biệt nếu bản thân tiết kiệm được cài đặt như một gói cho bản phân phối hệ điều hành của bạn. Dù sao, đây là một câu hỏi về hiệu suất và triển khai. Nó không thể được trả lời mà không biết tốc độ truyền thông nên như thế nào, và cũng ở đâu và cách bạn sẽ triển khai chương trình của bạn.

UPD: Bạn có thực sự cần phải viết trình nền của bạn trong C++ không?Nếu đó là do tính toán nặng được thực hiện trên đồ thị, có lẽ chỉ phần tính toán phải ở trong C++ (một mô-đun mở rộng)? Mở rộng thường được ưa thích với các kỹ thuật khác.

+0

Cảm ơn bạn, trình nền C++ phải được viết bằng C++ nhưng sau khi một số điều tra, tôi đã bắt gặp một ý tưởng, nó không phải là daemon - nó có thể được viết thành bộ thư viện được Python sử dụng bằng cách sử dụng 'Cython' /' Boost.Python'. Phần C++ là một trình biên dịch dưới mui xe, biên dịch đồ thị thành một số mã máy nhị phân. Tôi nghĩ rằng tôi tìm thấy giải pháp - làm cho Python daemon mà sẽ gọi một số chức năng từ thư viện C++ của tôi bằng cách sử dụng 'Cython' là giải pháp rất tốt. –

+0

Đồng ý. Nói chung nó là lựa chọn tốt nhất có thể: để thực hiện logic điều khiển chung trong Python và cung cấp những thứ không thể được thực hiện bằng Python như các mô đun mở rộng được thực hiện trong C++. – Ellioh

1

Tôi muốn giới thiệu Cython. Nó có rất phong nha C++ integration. Nó cung cấp cho bạn rất nhiều tự do để sử dụng C++ với nỗ lực khá ít, tức là gần như không có bản mẫu. Ngoại lệ C++ trở thành ngoại lệ Python. Tuy nhiên, bạn có thể tinh chỉnh rất nhiều thứ. Bạn nên thử nó.

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