首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用ES6导入/导出和worker_thread的文件之间的事件发射器

不使用ES6导入/导出和worker_thread的文件之间的事件发射器
EN

Stack Overflow用户
提问于 2021-03-01 23:43:37
回答 2查看 598关注 0票数 0

我有两个文件,第一个是

你可能会在下面看到:

代码语言:javascript
复制
import EventEmitter from "events";
import tasklist from 'tasklist';

export const stateManager = new EventEmitter();

//IIFE working every 10 seconds via cron task, from the file below
(async () => {
  const processes = await tasklist();
  const exist = processes.find(({imageName}) => imageName === 'process.exe');

  if (!!exist) {
    console.log(!!exist)
    stateManager.emit('state', 1);
  } else {
    console.log(!!exist)
    stateManager.emit('state', 0);
  }
})();

第二个是

文件,该文件无休止地运行。

代码语言:javascript
复制
//import stateManager from first file
import { stateManager } from "./src/controller.js";

/**
 * Here is part of the code
 * which starts the first file
 * as a Worker cron-task every 10 seconds
 * It doesn't block the thread.
 */
const bree = new Bree({
  logger: logger,
  jobs: []
});
bree.add({
  name: "state",
  interval: ms("10s")
})
bree.start();


// First listener
console.log('check');
stateManager.on('state', function firstListener(...args) {
  console.log('State updated', args);
});

在我启动

,我在控制台中看到的输出如下:

代码语言:javascript
复制
check
false
State updated [ 0 ]
 [LOGGER]  21-03-01 18:03:67  info : Worker for job "state" online
false
 [LOGGER]  21-03-01 18:03:08  info : Worker for job "state" exited with code 0
 //every 10 second then =>
 [LOGGER]  21-03-01 18:13:69  info : Worker for job "state" online
false
 [LOGGER]  21-03-01 18:13:06  info : Worker for job "state" exited with code 0

或者如果我出口

来自另一个(第三个文件),而不是

直接。

代码语言:javascript
复制
check
 [LOGGER]  21-03-01 18:03:23  info : Worker for job "state" online
false
 [LOGGER]  21-03-01 18:03:63  info : Worker for job "state" exited with code 0
 //every 10 second then =>
 [LOGGER]  21-03-01 18:13:23  info : Worker for job "state" online
false
 [LOGGER]  21-03-01 18:13:63  info : Worker for job "state" exited with code 0

因此,任务运行良好,事件侦听器永远不会结束,但不知何故,它不会对

事件或反应,一开始只有一次。为什么会出现这样的问题?因为我在控制台中没有其他错误?

如果有帮助,我会使用

作为作业队列管理器,它实际运行cron-task本身。

解决方案

我想我已经找到了问题的解决方案,但我不能理解原因本身。

在我的例子中,最好不要使用

库,但是

,所以代码现在看起来像这样:

代码语言:javascript
复制
import { parentPort } from "worker_threads";
import tasklist from 'tasklist';

//IIFE working every 10 seconds via cron task, from the file below
(async () => {
  const processes = await tasklist();
  const exist = processes.find(({imageName}) => imageName === 'process.exe');
  if (parentPort) parentPort.postMessage({ state: !!exist })
})();

接收端如下所示:

代码语言:javascript
复制
bree.on('worker created', (name) => {
  bree.workers[name].on('message', (message) => {
    console.log(message);  // Prints { state: !!exist }
  })
});

因此,来自第一个文件的消息已成功传递。但如果有人能给我解释一下,我会很高兴的,为什么

库不能在不同的作品之间传递消息,即使

已正确导出。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-02 00:31:26

基本上开始一个新的进程。你得到的结果等同于:

代码语言:javascript
复制
node eventListener.js

然后:

代码语言:javascript
复制
node state.js

每10秒。每隔10秒创建一个事件发射器,但没有附加侦听器,因为它位于您的

未运行的文件,只是

每10秒。

Bree可能在这方面有点过头了,你可以直接使用

或者

循环。这些是

无论如何,你没有在JS端做任何繁重的事情,所以你不应该阻塞太多。不过,如果你真的想使用工人,你的解决方案对我来说似乎是可以的。直接与员工一起工作并放弃,可能会更容易

..。

另一种选择是设置

使用

在一个单独的文件中。您只需运行另一个文件(它将每10秒运行一次所有程序)。

票数 1
EN

Stack Overflow用户

发布于 2021-03-02 00:32:01

似乎我理解这种行为的原因,但我不确定这是不是Bree问题本身。

只是不要将build函数用作Bree的内置cron任务。而不是在文件中使用cron-task。不管你具体怎么做,通过

和递归,或者通过节点调度器模块本身。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66425155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档