使用 ts-node 时通过 fork() 调用子进程

Posted

技术标签:

【中文标题】使用 ts-node 时通过 fork() 调用子进程【英文标题】:invoke a child process via fork() when using ts-node 【发布时间】:2019-03-05 06:46:18 【问题描述】:

我有一个打字稿项目,而不是首先使用tsc,我只是直接通过ts-node 运行。

在我的代码中,我需要使用fork() 创建一个子进程。

如果我运行 child_process.fork('ChildProcess.ts')ChildProcess.ts 之类的代码包含一些仅打字稿构造(例如:import export、...),那么解释器将是 node,而不是 ts-node失败。

可能建议使用child_process.exec('node ./node_modules/.bin/ts-node ChildProcess.ts) 之类的东西,但我真的想要/需要在专门使用fork() 时在父进程和子进程之间建立的 IPC 通信通道。

关于如何实现这一点的任何想法?

谢谢!

【问题讨论】:

importexport 不是特定于 TypeScript 的。它们是 ES2015 中引入的标准 javascript。 (Node 现在通过 --experimental-modules 运行时标志对它们进行了实验性的部分支持。)但是,当然,这些都不能帮助您使用可能在文件中的真正的仅 TypeScript 功能,例如类型注释。 :-) 我不确定是什么问题。 fork('ChildProcess.ts') 也应该使用 ts-node 运行它。你能提供一种方法来复制这个问题吗? 是的,没错,我可能选择了不好的例子。所以,是的,假设我正在使用注释,我就是这样。 :-) 【参考方案1】:

正如the reference 所说,分叉进程中的execArgv 继承自当前进程:

execArgv 传递给可执行文件的字符串参数列表。默认值:process.execArgv。

当入口点运行为:

ts-node index.ts

execArgv 默认为ts-node 二进制:

[ '...\\ts-node\\dist\\_bin.js' ]

child_process.fork('ChildProcess.ts') 

也与ts-node 一起运行。

【讨论】:

啊,你说得对。谢谢。我遇到了问题,因为我为此编写了一个初始测试并使用 jest 来运行通过 node 而不是 ts-node 调用的测试。我失去了这一点的网站。我用打字稿写了一个快速的小驱动程序 sn-p 并通过ts-node 运行它,你是对的。 ts-node 被调用并且我的子进程中的打字稿运行良好。现在要弄清楚如何为此编写一个很好的笑话测试。 ;-) 谢谢! 很高兴您很快解决了这个问题。根据您的测试方式,您可能会断言execArgv【参考方案2】:

如果在 fork 进程时省略文件扩展名,它在开发过程中与 ts-node 一起使用,在生产中与 tscnode 一起使用。

在您的app.ts 文件中:

import  fork  from 'child_process';

fork('./longRunningProcess');

然后您可以在 longRunningProcess.ts 文件中包含 TypeScript 结构。 转译为app.jslongRunningProcess.js 后,在使用常规node 运行时仍然可以工作。

【讨论】:

【参考方案3】:

如果ts-node 本身不处理fork(这有点令人惊讶,但我不使用它),并且您需要 IPC,我认为您的选择是:

事先使用tsc,以便调用 JavaScript 文件,或者

按需使用tscChildProcess.ts文件编译成ChildProcess.js文件,然后forkChildProcess.js文件。

【讨论】:

啊,不漂亮,但是是的,我没有想到按需方法。像tsc.compile(['ChildProcess.ts'], ['--out', 'ChildProcess.js']) 后跟fork('ChildProcess.js') 这样的东西可能只是获得我需要的最简单的方法。让我再想一想。谢谢!

以上是关于使用 ts-node 时通过 fork() 调用子进程的主要内容,如果未能解决你的问题,请参考以下文章

进程控制---fork函数

每次调用fork()函数之后,父线程和创建出的子线程都是从fork()后开始执行

在while循环中使用execvp和fork时的无限循环

Perl和操作系统交互:fork

fork()和僵尸进程

fork和exec函数