小编kao*_*aoD的帖子

强制Node.js刷新对子进程的写入

我生成一个像这样的子进程:

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()但这也终止了子进程(我希望保留在后台,流数据).

我还触发了一个刷新填充缓冲区的大量写入,但这不是一个真正的选择.

有没有办法手动刷新流?

stdin flush stream node.js

11
推荐指数
1
解决办法
4950
查看次数

减少大流而不会出现堆栈溢出

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) …

stack-overflow reduce scala range stream

9
推荐指数
2
解决办法
1200
查看次数

寻找具有数据偏移支持的glTexSubImage2d的替代方案

我有一个PBO,由CUDA每帧更新.在它之后,我还想使用这个PBO更新纹理,我使用它glTexSubImage2d.我担心更新整个纹理是昂贵的,并且只想更新纹理的可视区域,而我的PBO上有整个数据.

问题是,尽管glTexSubImage2d接受偏移量,宽度和高度作为参数,但它们仅在绘制到纹理时使用,而我仍然需要线性铺设我的缓冲区数据.我担心自己准备缓冲区数据可能太贵了(实际上它会非常昂贵,因为我的PBO驻留在GPU内存中.)

有没有替代方法glTexSubImage2d也需要缓冲区偏移量的参数,还是应该一次更新整个纹理?

opengl textures

6
推荐指数
1
解决办法
2058
查看次数

cudaGraphicsResourceGetMappedPointer返回"未知错误"

我正在创建一个这样的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产生"未知错误",所以我很困惑.我很欣赏任何想法.

opengl interop cuda

4
推荐指数
1
解决办法
1755
查看次数

&lt;select&gt; 事件 'change' 不会在 'selectedIndex' 更改时触发

change事件被解雇正确的,当我手动更改了<select>我的用户界面上点击价值,但设置这样的选择指标...

this.selectedIndex = 0;
Run Code Online (Sandbox Code Playgroud)

...不会触发附加事件。

我应该将更改绑定到哪个事件?除了手动触发更改事件之外,还有其他解决方法吗?(即:$(this).change();设置所选索引后。)

jquery events html-select

4
推荐指数
1
解决办法
3763
查看次数

通过FIFO重定向stdin

我在GNU/Linux下运行一个服务器应用程序(用Java编写),它接受输入(来自stdin,我猜)并解释它运行一些命令.我不想在终端窗口中运行应用程序(我想运行一个守护进程),但我仍然希望能够随时输入命令.我以为我可以用fifos做到这一点,所以我用mknod创建它.问题是cat fifofile> java ...cat fifofile | java ...由于某种原因失败并显示"找不到文件"错误.

仅使用cat进行读写,fifo可以完美地工作.

有没有办法解决这个问题,或者以其他方式实现同​​样的目标?

linux shell stdin fifo mknod

2
推荐指数
1
解决办法
2200
查看次数