如何终止已关闭的 ZeroMQ 套接字的进程?

4 zeromq node.js

我正在使用 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 );
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,即使 3 秒后关闭套接字,进程也不会退出。我无法使用process.exit,因为我正在制作的模块用于很多开玩笑的测试。我在ZeroMQ 文档
中没有找到任何内容。

use*_*197 5

考虑到默认的 ZeroMQ API 规范,对.close()套接字实例的任何尝试都会被阻塞,直到一定时间到期。

典型的优雅终止序列依赖于在创建实例属性时预先设置该实例属性的做法:

socket.setsockopt( zmq.LINGER, 0 ); // A SYSTEMATIC STEP UPON CREATION
Run Code Online (Sandbox Code Playgroud)

ZMQ_LINGER:设置套接字关闭的延迟时间

ZMQ_LINGER选项将为指定套接字设置延迟时间。zmq_disconnect()延迟时间决定了在使用 断开或关闭套接字后,尚未发送到对等方的挂起消息应在内存中停留多长时间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](对于所有套接字类型)

有关详细信息,请阅读 ZeroMQ API 文档。