6.2 ZeroMQ多进程和混合语言编程
使用ZeroMQ的一个最大的好处是我们可以用不同的语言来写不同的进程。这样我们就可以部署一个node.js写的进程发消息来向用python写的进程发消息和请求服务。
在这个例子中,我们使用ZeroMQ来实现(至少)以下两点:我们将在一种语言中执行用另一种不同语言写的代码。在下面的示例代码,我们用JavaScript/Node.js写的客户端向用python写的代码请求服务。这样我们就可以有一个方法请求可用的服务。如:Lxml XML包和SciPy和Numpy数值计算和科学计算软件包.
我们将启动多个服务进程或工人进程,无论是什么,都可以平衡负载。这应该有助于提高负荷下的吞吐量,同时避免了Python GIL(全局解释器锁),只允许一个线程在任意时刻执行python代码的问题。(更多与这个相关的问题的内容请查看:https://wiki.python.org/moin/GlobalInterpreterLock)
调试--提示你当然可以在python代码中使用print语句来跟踪执行过程。
根据你的代码结构,你可以考虑使用装饰器,这样就可以跟踪被装饰函数的输入和输出了。你可以在这里找到有关装饰器的帮助文档:http://www.davekuhlman.org/python_book_01.html#decorators-and-how-to-implement-them.
python调试器pdb很好用。事实上,我通常使用pdb(https://pypi.python.org/pypi/ipdb),你需要在一个单独的窗口或者会话来运行这个模块,这样调试命令和输出结果就不会混在一起了。
6.2.1 简单的轮循负载分布
在我们的例子中,node.js模块以ZeroMQ消息形式将多个请求发送给代理,然后把他们一起传送给工人模块,如果我们启动了多个工人进程,这些请求就会继续向前传送,轮转式的给其他工人进程。
以下就是我们的node.js客户端:
以下是python代理,就是客户和工人们之间的中间人一样:
最后,这是实际使用Lxml提供处理XML功能的Python的工人进程:
提示:如果启动了那样的多个node.js进程,上面的代码也是可以处理的。
我已经用node.js和python写了这个例子,但是我们同样可以使用ZeroMQ进行不同语言之间的通讯。支持ZeroMQ的语言有