背景问题
最近在搬一些把 Python 解释器嵌入到 C++中砖( Windows 下),虽然能搬,但并不是什么特别愉快的体验:要屏蔽应用对 Python 的显式依赖,所以通过 C 接口在 C++和 Python 之间传递数据和错误信息,C 接口下面又用 Cython 来进行数据转换和函数调用,基本上是这样的:
C++ ⇌ C ⇌ Cython ⇌ Python
还有个麻烦是这个过程中 C++,Cython ,Python 没法一起 debug ( C++用的 CLion 开发,Cython 和 Python 用的 PyCharm ),而且 Cython 的 debug 只能进入到生成的 cpp 中,不过还好,能定位问题在哪个 Cython 函数,很多时候只能在 Cython 中加 print 来看传递的参数 (如果有更好的办法请教教我 o(╥﹏╥)o)
总之,坑,特别多的坑,即使用了 Cython 不直接用 Python 的 C API 也要写不少代码,而且 Python 解释器在应用进程,如果没照顾好它在运行中的情绪,轻则自己崩掉,重则一起崩掉,不管哪种情况应用基本要重启了。
新的解决方案
不清楚什么时候在哪儿看到过 RPC(Remote Procedure Call)的概念, 然后经过一番谷噜,看到了这篇博客 https://opensource.com/article/20/3/zeromq-c-python 作者开头提到的困境跟我现在经历的差不多(其实给 Python 写扩展还好啦,Python 生态就是这样来的,反过来把 Python 当成库用才更头疼)。作者提到 ZeroMQ 是这种问题的解决方案( ZeroMQ 我是在 V2 看到过相关讨论的,虽然当时可能并不清楚这东西多有用)。经过翻阅一些文档看了一些例子,我对以上背景问题也有了以下基于 ZeroMQ 的设想方案:
C++中启动一个 Python 脚本,该脚本运行在独立进程中作为一个服务等待请求; C++通过发送请求传递需要处理的参数给 Python ,Python 处理后把结果发送回去;要是传递的参数不合适导致服务崩了,没关系,重启该 Python 脚本继续服务,修改参数再传(如果是 Python 解释器嵌入 C++则只能启动一次关闭一次,无法重新启动);完事儿后 C++可以传递特殊参数优雅地停止该服务。而且开发时各个模块我都可以在各自的开发环境中 debug 了╰(°▽°)╯!
有了这种方式后的确打开了编写应用的新世界大门(即使仅仅是本地的桌面应用),用合适的语言和工具编写独立的功能模块,然后通过 ZeroMQ 将各个独立模块连接起来构成整个系统。
前景是美好的,但是实践起来肯定有坑,所以想请熟知 ZeroMQ 并用其在应用中摸爬滚打过的前辈们现身说法,谈谈自己对 ZeroMQ 看法,分享一些观点和经验,踩过的坑,缺点以及克服方法。
关于 ZeroMQ 的若干问题
- Hintjens 大神的这份遗产 https://zguide.zeromq.org/ 主要讲了 HowTo ,有没有讲解底层原理的一些资料呢?
- C 源码暂时没有时间和精力去啃,缺乏一些关键的背景知识也啃不动,所以需要哪些背景知识才能很好的理解其中的各种概念呢?
- 想了解使用 ZeroMQ 各种 pattern 时底层究竟发生了什么?数据是怎么从一个地方传到另一个地方的?
在我的观念里至少要了解到某个工具的一些基本的底层原理才能更好的使用该工具。ZeroMQ 是一个值得深入了解的工具。
明天调休继续上班,到时再来看各位的回复