如何使用已closures的ZeroMQ套接字来终止进程?
我正在使用ZeroMQ进行发布订阅。 这是一个简化的代码:
import zmq from 'zeromq'; import d from 'debug'; const debug = d('publisher'); let port = '8000'; let subject = 'FLIGHTS'; const socket = zmq.socket('pub'); socket.on('close', function(...toto) { debug('connection closed'); }); socket.on('close_error', function(...toto) { debug('error while closing connexion'); }); socket.monitor(10, 0); socket.bindSync('tcp://*:' + port); export function send(message: object) { const jsonMessage = JSON.stringify(message); socket.send([subject, jsonMessage]); } export function close() { socket.close(); } setTimeout( () => close(), 3000 );
我遇到的问题是,即使套接字在3秒后closures,进程也不会退出。 我不能使用process.exit
因为我正在做的模块被用于很多的笑话testing。
我在ZeroMQ文档中找不到任何东西。
给定默认的ZeroMQ API规范,任何尝试.close()
套接字实例都会阻塞,直到一定的时间到期。
典型的优雅的终止顺序依赖于在其创build时预先设置该实例属性的实践:
socket.setsockopt( zmq.LINGER, 0 ); // A SYSTEMATIC STEP UPON CREATION
ZMQ_LINGER
:设置套接字closures的ZMQ_LINGER
时间
ZMQ_LINGER
选项应该为指定的套接字设置ZMQ_LINGER
时间。 持续时间决定了在一个套接字与zmq_disconnect()
断开连接或用zmq_close()
closures之后,尚未发送给对等体的待处理消息将在内存中逗留zmq_close()
,并进一步影响套接字上下文与zmq_ctx_term()
的终止。 。 以下概述了不同的行为:– 值-1指定了无限的逗留期间。 在调用
zmq_disconnect()
或zmq_close()
之后,不得抛弃挂起的消息。 试图用zmq_ctx_term()
终止套接字的上下文应该阻塞,直到所有待处理的消息已经被发送给对等体。– 值0指定了不存在的时间段。 在调用
zmq_disconnect()
或zmq_close()
之后,应立即丢弃挂起的消息。– 正值指定延迟周期的上限(以毫秒为单位)。 在调用
zmq_disconnect()
或zmq_close()
之后,不得抛弃挂起的消息。 试图用zmq_ctx_term()
终止套接字的上下文应该阻塞,直到所有等待消息已经被发送到对等体,或者等待时间到期,之后任何未决的消息将被丢弃。默认值〜30000 [ms](适用于所有套接字types)
有关详细信息,请阅读ZeroMQ API文档。