Tag: 处理

PHP – 有什么办法来控制stream程执行?

我有php和nodejs安装在我的服务器。 我打电话通过php使用node canvas的nodejs代码 喜欢: <?php exec(node path/to/the/js/file); ?> 问题: 由于node canvas ,执行的每个进程消耗大约250 Mb的内存。 所以,如果我的服务器有大约8Gb的内存,那么只有32个用户可以在任何时间点使用这个服务,而且如果用户数超过,就有可能导致服务器崩溃。 有什么可扩展的解决scheme来解决这个问题吗? 更新我必须使用Canvas服务器端,因为我的业务需求,所以我使用node canvas ,但它是沉重的消耗内存,这是一个巨大的问题。

无法从特定应用程序的spawnpipe道输出stdout

我有两个脚本A.js和B.js,以及第三方应用程序(这是开源的)。 脚本A.js使用execSync启动第三方应用程序。 脚本B.js使用spawn启动脚本A.js。 如果我自己运行脚本A.js,我可以看到第三方应用程序的整个输出。 当我通过运行脚本B.js间接运行它时,我只能看到一些输出。 A.js const { execSync } = require('child_process'); console.log("Hello"); execSync('mybinary.exe -arg1 -arg2', { stdio: 'inherit' }); B.js const { spawn } = require('child_process'); const app = spawn(process.execPath, ['A.js'], { stdio: ['inherit', null, 'inherit'] }); app.stdout.on('data', (chunk) => { process.stdout.write(chunk); }); 当我启动B,我只看到“你好”,但二进制正在运行(这是一个服务器,我可以打开一个TCP连接到它)。 我只是没有看到输出。 当我自己启动A时,我看到“Hello”和普通的二进制输出。 如果我将B的stdout改为“inherit”,它就可以工作。 为什么会发生这种情况,我该如何解决这个问题? 更新:似乎没有任何关系使用两个脚本。 直接生成二进制文件而不使用stdioinheritance会出现同样的问题。 似乎依赖于第三方应用程序。 如果程序只是打印到标准输出,程序如何影响节点? 背景:我想启动一个服务器,然后在服务器准备就绪时运行一个命令。 准备就绪后,服务器将打印出一条特定的消息。 […]

pipe道不被subprocess读取?

我想运行node.js作为一个subprocess并为其提供input。 使用C,这里是我的一些示例代码。 我遇到的问题是,尽pipesubprocess的stdout仍然是针对terminal的,但是在给subprocess标准input一个'Hello World'行后,我什么也看不到。 即使我()pipe道,我没有看到输出。 但是,如果我closures了pipe道的input,那么terminal上会出现“Hello World”。 subprocess似乎只是缓冲 – 为什么呢? 我想最终将subprocessstdoutredirect到另一个pipe道,并从main()中读取它。 int main(int argc,char * argv []){ int toNode[2]; pipe(toNode); pid_t child_pid = fork(); if (child_pid == 0) { // child // close write end close(toNode[1]); // connect read end to stdin dup2(toNode[0], STDIN_FILENO); // run node executable char* arg_list[] = { "/usr/bin/node", NULL}; execvp(arg_list[0], […]

node.js中的子/辅助线程

我有一个需求,我必须运行一个独立于主节点线程的进程。 基本上,目的是从主节点线程数据启动辅助进程,而不是等待callback或任何结果,因为辅助进程不必向主线程返回任何东西。 我想实现这一点,而不会阻塞主节点线程,主线程不应该在将数据传递到辅助线程后发生什么。 基本上,就二级进程而言,主线程的进程在将数据发送到辅助线程之后结束。 任何build议如何我可以实现这一目标? 我读了关于subprocess,webworkers,dnode和进程nexttick,但我不知道什么是实现它的最好方法。 我尝试了nexttick,但是我的经验是它仍然是主线程的一部分,虽然是asynchronous的。

Node JS本地模块:你可以在独立的Libuv / NodeJS风格的过程中运行C / C ++方法吗?

这个有点奇怪 我写了一个大部分时间都运行良好的NodeJS本地模块,但是这个类包含一个在共享内存的上下文中运行的模块。 粗略地说,模块打开一个IO服务器,但有一个错误,需要我打开和closuresIO服务器来检索一个特定的值…当我执行此操作时,任何指针发现引用旧的IO服务器对象明显打破/ segfault(一个“涂鸦空间”的错误,对吧?)。 为了解决这个问题,我现在使用NodeJS的child_process.fork()在独立的上下文中运行错误的方法,并在主进程和分叉进程之间传递消息,让程序按需要运行(也就是我在里面调用方法分叉的进程,并使用'process.on(“message”,…)“来检索结果)。 这工作得很好,但感觉像一个非常昂贵的黑客… 为了logging,我尝试使用Libuv线程来运行该方法,但我遇到了同样的问题。 我猜这是因为函数调用仍然在共享内存中。 有没有办法让我用C ++在“NodeJS风格”过程中运行一小部分(或更多)C / C ++代码?

访问节点中长时间运行的进程的grpcstreamvariables

我正在使用Node.js连接到使用执行长时间运行任务的gRPC的服务器。 在进行作业时,服务器将单向stream发送到客户端(Node.js应用程序)。 我需要实现一个停止button,并告诉closuresgRPCstream将停止正在进行的工作。 这是目前我的代码: let express = require('express'), router = express.Router(), grpc = require('grpc'), srv = grpc.load(__dirname + '/job_handler.proto').ns; let startJob = (jobID, parameters) => srv.createJob(jobID, parameters); router.post('/jobs', (req, res) => { let lengthyOperation = startJob(jobID, parameters); lengthyOperation.on('data', (data) => { console.log(`Data from lengthy operation: ${data}`); }); lengthyOperation.on('end', () => console.log('Lengthy operation completed'); }); res.setHeader('Location', […]

从标准input读取时,Node.js无法读取pythonsubprocess标准输出

我有一个node.js脚本启动一个pythonsubprocess并读取它的stdout。 只要Python进程不尝试从标准input读取,它就会工作。 然后父进程没有从孩子得到任何东西。 我在这里有node.js脚本和两个pythontesting用例:(这两个示例工作,如果你评论尝试从标准input读取的行) 第一个孩子: import sys print('before') for line in sys.stdin: print(line) print('after') 第二个孩子: import sys print('before') while True: line = sys.stdin.readline() if line != '': print(line) else: break print('after') 家长: const spawn = require('child_process').spawn; let client = spawn('python', ['test1.py'], {cwd: '/tmp'}); client.stdout.on('data', (data) => { console.log(data.toString()); }); client.stderr.on('data', (data) => { console.log(data.toString()); }); […]

NodeJS – pipe道多个FFMPEG进程

我试图编程一个转换器,可以采取任何video源,并将其转换为MP3。 mp3应该保存在我的硬盘上,或者保存在一个缓冲区中,通过电报发送。 目前为止效果不错,我唯一面临的问题是一次只能拍一个video,而我不知道为什么。 // IMPORTS var fs = require('fs'); var https = require('https'); var child_process = require('child_process'); // EVENTEMITER (Not used so far) var util = require('util'); var EventEmitter = require('events').EventEmitter; // STREAMHANDLER var StreamHandler = function(url, name){ // VARIABLES self = this; this.url = url; this.name = name; // CREATE FFMPEG PROCESS var spawn […]

Node.js:杀死ChildProcess#spawn的subprocess

考虑下面的代码: import {spawn, exec} from 'child_process'; var child = spawn('su', [process.env.USER, '-c', 'while (true); do sleep 0.3; echo "tick"; done'], {stdio: ['ignore', 'pipe', 'pipe']} ); child.stdout.pipe(process.stdout); child.stderr.pipe(process.stderr); setTimeout(() => { child.kill(); }, 1000); 在这里,我试图运行特定的脚本,运行其他subprocess(在这个例子中su会产生一个bash进程),并closures它。 但是,我不能让它工作如何,我期望。 调用child.kill()杀死su父进程而不是其subprocess。 可以做些什么来实现它 – 调用exec(`pkill -TERM -P ${child.pid}`)而不是child.kill() 。 据我所知,这将杀死与父母child.pid整个进动树。 然而,将两种方法结合起来却有一些奇怪之处: setTimeout(() => { child.kill(); exec(`pkill -TERM -P ${child.pid}`); }, 1000);` […]

如何用node.js模拟bash进程replace?

假设我有1.js : process.stdout.write("Hello world.\n") 和2.js : process.stdout.write( require("fs") .readFileSync(process.argv[2]) .toString() .replace(/Hello/,"Goodbye") ) 并可以在bashterminal内执行以下命令获取2.js输出: $ node 2.js <(node 1.js) Goodbye world. 我怎样才能模拟相同的过程替代机制,而无需bash中介? 我应该在3.js写什么? var child_process = require("child_process") var cp1 = child_process.spawn("node",[__dirname + "/1.js"]) var dev_fd_pipe = ??? // How do I create it? var cp2 = child_process.spawn("node",[__dirname + "/2.js",dev_fd_pipe]) cp2.stdout.pipe(process.stdout)