干净退出0MQ

来源:互联网 发布:电视盒你懂得软件 编辑:程序博客网 时间:2024/04/19 23:33

ØMQ程序总是开始于创建一个上下文(context),然后使用它来创建套接字。在C语言中是调用zmq_ctx_new()。你应该在进程中仅仅创建和使用一个上下文。技术上,这个上下文是单个进程中所有套接字的容器,并作为进程内套接字的传输工具,这是连接进程内的线程的最快方法。如果一个进程有两个上下文,他们会像各自独立的ØMQ实例。如果那就是你想要的,OK,但其它情况下要记得:

在你的主线代码的开始调用zmq_ctx_new(),最后调用zmq_ctx_destroy()。

如果你使用系统函数fork(),每个进程需要自己的上下文。如果你在主进程的fork()之前调用了zmq_ctx_new(),那么子进程会得到他们自己的上下文。一般来说你会在子进程中做那些有趣的事情,那么就在父进程里管理这个。

干净退出

优雅的程序员与优雅的杀手共享一句格言:完事的时候要清理干净。如果你用类似Python语言版本的ØMQ,会自动的帮你释放。但是当使用C语言时,用完对象不得不小心释放,否则会内存泄漏,不稳定程序,会遭报应。

内存泄露是一方面,但是ØMQ对你如何退出程序是很挑剔的。原因是技术性的痛苦的,但后果是如果你没关闭套接字,zmq_ctx_destroy()函数会永远挂起。而且即使你关闭了所有的套接字,zmq_ctx_destroy()默认会永远等待挂起的连接或挂起的发送。除非你在关闭前将这些套接字的LINGER(徘徊)设置为0。

我们需要关心的ØMQ对象是消息、套接字、和上下文。幸运的是这很简单,至少在简单的程序中是这样的:

  • 操作完毕的同时总是要使用zmq_msg_close()关闭消息。
  • 如果你打开关闭很多的套接字,这可能是个信号,你需要重新设计程序。
  • 退出程序时,关闭套接字然后调用zmq_ctx_destroy()。这会关闭上下文。

至少对于C开发来说是这样的。在带有自动对象销毁的语言中,当你离开作用域时套接字和上下文会被销毁。如果你使用异常处理,那么和其它资源一样,你得在“final”段中做清理。

如果你在做多线程工作,会比这复杂的多。下一章我们才到多线程的内容,但是因为你们有些人往往不顾警告,走不稳就开始试着跑,下面是一份快速而粗略的多线程ØMQ程序的干净退出指南。

首先,不要尝试在多个线程中使用同一个套接字。不,别解释你为何觉得这样特别有趣,请千万别这么做。下一步,你得将每个仍有请求的套接字都关闭。正确的方法是设置一个低的LINGER值(1秒),然后关闭套接字。如果你的语言绑定没有在你销毁上下文时自动帮你这么处理,我建议你可以发一个补丁。

最后,销毁上下文。这将导致关联线程(也就是共享上下文)中的所有阻塞的接收、轮询、发送都返回一个错误。捕获那个错误,然后设置徘徊,关闭此线程的套接字,然后退出。不要对相同的上下文销毁两次。主线程的zmq_ctx_destroy将阻塞直到它知道的所有套接字都已安全关闭。

0 0