我生成一个像这样的子进程:
var child = require('child_process');
var proc = child.spawn('python', ['my_script.py', '-p', 'example']);
Run Code Online (Sandbox Code Playgroud)
我还设置了一些数据处理:
proc.stdin.setEncoding('utf8');
proc.stdout.setEncoding('utf8');
proc.stderr.setEncoding('utf8');
proc.stdout.on('data', function (data) {
console.log('out: ' + data);
});
proc.stderr.on('data', function (data) {
console.log('err: ' + data);
});
proc.on('close', function (code) {
console.log('subprocess exited with status ' + code);
proc.stdin.end();
});
Run Code Online (Sandbox Code Playgroud)
我的Python脚本从stdin每行读取行并执行一些操作并打印到stdout.它在shell中工作正常(我写了一行,我立即获得输出)但是当我在Node中执行此操作时:
for (var i = 0; i < 10; i++) {
proc.stdin.write('THIS IS A TEST\n');
}
Run Code Online (Sandbox Code Playgroud)
我一无所获.
我必须修复它调用,proc.stdin.end()但这也终止了子进程(我希望保留在后台,流数据).
我还触发了一个刷新填充缓冲区的大量写入,但这不是一个真正的选择.
有没有办法手动刷新流?
1我试图制作一个无限制因子函数(只是出于好奇.)这适用于大型n(尝试高达100000并且它似乎工作,虽然我无法检查输出值的正确性,因为,它是大!)
(BigInt(1) to n).reduceRight(_*_)
Run Code Online (Sandbox Code Playgroud)
但我担心整个BigInt(1) to n范围可能都在记忆中,而我只是逐个元素地需要它reduceRight.看看Scala的标准库代码看起来BigInt(1) to n实际上是输出整个Range而不是懒惰Stream但我发现Stream.range我可以这样使用(注意n+1,流范围是独占的)
Stream.range[BigInt](BigInt(1), BigInt(n+1)).reduceRight(_*_)
Run Code Online (Sandbox Code Playgroud)
它适用于n=10000(由于某种原因,它需要更长的时间!这让我觉得也许正常的范围实际上也是一个Stream?)但是因为n=100000我得到这个堆栈溢出
java.lang.StackOverflowError
at java.math.BigInteger.add(Unknown Source)
at scala.math.BigInt.$plus(BigInt.scala:161)
at scala.math.Numeric$BigIntIsIntegral$class.plus(Numeric.scala:28)
at scala.math.Numeric$BigIntIsIntegral$.plus(Numeric.scala:40)
at scala.math.Numeric$BigIntIsIntegral$.plus(Numeric.scala:40)
at scala.math.Numeric$Ops.$plus(Numeric.scala:208)
at scala.collection.immutable.Stream$$anonfun$range$1.apply(Stream.scala:695)
at scala.collection.immutable.Stream$$anonfun$range$1.apply(Stream.scala:695)
at scala.collection.immutable.Stream$Cons.tail(Stream.scala:634)
at scala.collection.immutable.Stream$Cons.tail(Stream.scala:626)
at scala.collection.LinearSeqOptimized$class.reduceRight(LinearSeqOptimized.scala:130)
at scala.collection.immutable.Stream.reduceRight(Stream.scala:47)
at scala.collection.LinearSeqOptimized$class.reduceRight(LinearSeqOptimized.scala:131)
at scala.collection.immutable.Stream.reduceRight(Stream.scala:47)
at scala.collection.LinearSeqOptimized$class.reduceRight(LinearSeqOptimized.scala:131)
at scala.collection.immutable.Stream.reduceRight(Stream.scala:47)
...
Run Code Online (Sandbox Code Playgroud)
很明显,reduceRight就是这样称呼自己
reduceRight(reduceRight(first, second, op), third, op)...
Run Code Online (Sandbox Code Playgroud)
因此堆栈溢出.我假设它不是尾部调用优化的,因为它首先减少然后在返回值之前运行,因此无法进行优化.那我怎么能解决这个问题呢?我是否应该放弃功能方法并针对自定义命令式代码进行减少?
让我感到非常奇怪的是,虽然使用流几乎相同(BigInt(1) …
我有一个PBO,由CUDA每帧更新.在它之后,我还想使用这个PBO更新纹理,我使用它glTexSubImage2d.我担心更新整个纹理是昂贵的,并且只想更新纹理的可视区域,而我的PBO上有整个数据.
问题是,尽管glTexSubImage2d接受偏移量,宽度和高度作为参数,但它们仅在绘制到纹理时使用,而我仍然需要线性铺设我的缓冲区数据.我担心自己准备缓冲区数据可能太贵了(实际上它会非常昂贵,因为我的PBO驻留在GPU内存中.)
有没有替代方法glTexSubImage2d也需要缓冲区偏移量的参数,还是应该一次更新整个纹理?
我正在创建一个这样的OpenGL纹理:
glGenTextures( 1, &boardTex );
glBindTexture( GL_TEXTURE_2D, boardTex );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
Run Code Online (Sandbox Code Playgroud)
我得到了一个句柄,board所以我假设纹理已成功创建.我想与CUDA共享这个纹理,所以我注册并映射资源:
cudaGLSetGLDevice(0);
cudaGraphicsGLRegisterImage( &boardImage, boardTex, GL_TEXTURE_2D, cudaGraphicsMapFlagsNone );
cudaGraphicsMapResources( 1, &boardImage, 0 );
Run Code Online (Sandbox Code Playgroud)
然后我尝试获取映射指针,如下所示:
float4* mappedPointer;
size_t mappedSize;
cudaGraphicsResourceGetMappedPointer( (void**)&mappedPointer, &mappedSize, boardImage );
Run Code Online (Sandbox Code Playgroud)
不幸的是,此调用返回错误并拒绝工作.为了以防万一,我确保纹理没有绑定在OpenGL上下文中.还是行不通.cudaGetErrorString产生"未知错误",所以我很困惑.我很欣赏任何想法.
该change事件被解雇正确的,当我手动更改了<select>我的用户界面上点击价值,但设置这样的选择指标...
this.selectedIndex = 0;
Run Code Online (Sandbox Code Playgroud)
...不会触发附加事件。
我应该将更改绑定到哪个事件?除了手动触发更改事件之外,还有其他解决方法吗?(即:$(this).change();设置所选索引后。)
我在GNU/Linux下运行一个服务器应用程序(用Java编写),它接受输入(来自stdin,我猜)并解释它运行一些命令.我不想在终端窗口中运行应用程序(我想运行一个守护进程),但我仍然希望能够随时输入命令.我以为我可以用fifos做到这一点,所以我用mknod创建它.问题是cat fifofile> java ...和cat fifofile | java ...由于某种原因失败并显示"找不到文件"错误.
仅使用cat进行读写,fifo可以完美地工作.
有没有办法解决这个问题,或者以其他方式实现同样的目标?