【问题标题】:Passing data from Django to C++ application and back将数据从 Django 传递到 C++ 应用程序并返回
【发布时间】:2011-09-02 20:01:11
【问题描述】:

我们正在创建一个交易应用程序,其中后端完全使用 C++(使用 QuickFix 引擎)。我们想在这个后端之上用 Django 构建一个 Web 应用程序,用户可以在其中下订单。 Django (python) 和 C++ 应用程序都将在它们自己的进程和地址空间中运行。您认为将订单/消息从 Django 传递到 C++ 的最佳主意是什么?

此外,这是一个交易应用程序,因此延迟是最大的问题。所以,我不想从 Django 将订单放入数据库,然后从 C++ 应用程序中获取。

我目前正在考虑通过共享内存或其他一些 IPC 机制来实现。这是个好主意吗?

【问题讨论】:

    标签: c++ python django architecture quickfix


    【解决方案1】:

    你必须使用一些 IPC 方法。您在这里没有提到的一个是让 C++ 进程侦听套接字。这将增加灵活性(以轻微的速度成本),这些过程甚至不需要在同一台机器上。

    我一直在做类似的事情,来自 C++,但想用 python 编写 UX。我的计算后端是 C++,我编译了一个 python 模块并使用烧瓶为 UX 生成 html。我的 C++ 和 python 在同一个进程中,所以我还没有在实践中解决你的核心问题。

    我要给出的一条建议是将所有 IPC 内容保留在 C++ 中,并使用 Boost.Python 在 C++ 中编写一个小的 Python 模块。这将让 python 进程在 pythony 世界中完成 95% 的工作,但会给你作为 C++ 开发人员希望发送到 C++ 的数据的位级信心。 Boost.Python 使桥接 C++ 和 python web 框架对我来说变得轻而易举。

    【讨论】:

    • 我只是好奇你的 C++ 和 python 是如何生活在同一个进程中的? boost.python?
    • @Lazylabs:是的,Boost.python(甚至是 python 本身,但 C-API 有点……嗯……C)允许嵌入,即从 C/C++ 启动 python 解释器.您还可以在您的 c++ 的“main”(可能会创建一些线程并返回)上编写一个 python 包装器,从而让应用程序从 python 启动。无论哪种方式都没什么区别(除非您的两个库都需要在主线程上使用事件循环。)
    • 感谢您的详细回复:-)
    • 实际上@Macke 我正在扩展而不是嵌入。 Python 是我的进程的操作系统入口点,我让 Boost.Python 输出一个作为 PYD python 模块工作的 DLL。当我的模块在 python 中加载时,Python 会动态加载 PYD(== C++ DLL)。从那里,python 可以实例化包装的 C++ 类并调用包装的 C++ 方法。
    【解决方案2】:

    你必须想出一个现有的协议或创建你自己的协议来允许 C++ 和 Python 之间的通信。我认为最简单的方法是使用一些 IPC,例如 ZeroC IceCORBA。或者,您可以throw in a native C++ code into Python 并使用 Django 中的那个,也可以使用 QuickFIX。

    如果您真的关心延迟(至少毫秒很重要,而不是纳秒)-you shouldn't use QuickFIX 或 Python。

    【讨论】:

      【解决方案3】:

      我会为 IPC 使用 zeromq

      【讨论】:

      • 谢谢。 Zeromq 看起来很有希望。我会对此进行更多调查。而且,跨多个系统进行扩展不会是这种设置的问题,这在共享内存的情况下可能是一个问题。
      【解决方案4】:

      我可能会选择 JSON-RPC 之类的东西并通过本地套接字或命名管道进行通信。

      共享内存更快,但如果你必须自己做的话,要正确处理会更棘手(这意味着并发和锁定,IMO,如果可能的话,应该避免。)

      这取决于消息大小和延迟要求。您可以随时尝试可以在共享内存上工作的 IPC 机制,就像 vlad 在下面的评论中提到的那样。

      (请注意,拥有一个可以依赖管道/套接字的 IPC 系统可能是一件好事,以防您将来需要对系统进行集群)。

      【讨论】:

      • 事实上,共享内存比套接字等更快。许多好的操作系统通过共享内存实现本地IPC。
      • @Vlad:我有点不清楚。我的意思是在共享内存中实现自己的 IPC 层比在套接字或管道上实现更困难。
      猜你喜欢
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 2015-05-30
      • 2017-10-29
      相关资源
      最近更新 更多