从shell脚本生成的Java InputStream中读取是成批进行的

从shell脚本生成的Java InputStream中读取是成批进行的,java,shell,inputstream,bufferedreader,processbuilder,Java,Shell,Inputstream,Bufferedreader,Processbuilder,我试图通过Java程序在Raspberry Pi上编排Python脚本。我有一些Python代码,里面有一个无限循环,读取超声波传感器的距离并将其输出到控制台。Java代码将其作为shell进程调用,然后从进程中读取输出流。我遇到的问题是数据以大批量的方式到达。我不是每次Python脚本输出到控制台时都得到一个新值,而是每隔10秒左右得到一个新数据。这是有问题的,因为我试图以近乎实时的方式在web仪表板上显示数据 该图如下所示: DistanceController |--getDist

我试图通过Java程序在Raspberry Pi上编排Python脚本。我有一些Python代码,里面有一个无限循环,读取超声波传感器的距离并将其输出到控制台。Java代码将其作为shell进程调用,然后从进程中读取输出流。我遇到的问题是数据以大批量的方式到达。我不是每次Python脚本输出到控制台时都得到一个新值,而是每隔10秒左右得到一个新数据。这是有问题的,因为我试图以近乎实时的方式在web仪表板上显示数据

该图如下所示:

DistanceController
    |--getDistance(public)
    |--getBufferSize(public)
    |--buffer(private)
    |--DistanceThread(private)
            |--bufferReference (private)
            |--PythonScriptProcess
Java代码如下所示:

DistanceController
    |--getDistance(public)
    |--getBufferSize(public)
    |--buffer(private)
    |--DistanceThread(private)
            |--bufferReference (private)
            |--PythonScriptProcess
这是一个包装类,它实例化了一个新线程(单独的类)以从Python脚本的输出流中读取

public class DistanceController {
    private DistanceThread distanceThread;
    private Thread t;
    private LinkedList<DistanceVT>  buffer = new LinkedList<DistanceVT>();

    public DistanceController()
    {            
        t = new Thread(distanceThread);
        t.start();
    }

    public DistanceVT getDistance() {
        return buffer.getLast();
    }
}

谢谢大家的帮助。EJP解决了缓冲问题——在Python代码中添加sys.stdout.flush()解决了这个问题

至于其他问题,你是对的。我的意思是,由于我在一个单独的线程上阅读,程序的主线程可以继续执行其他逻辑

读取线程将数据累积到一个列表中,该列表由创建它的类传递给它。然后可以通过这个包装类访问这些数据,而无需等待输出完成

import time
import datetime
from random import randint
import sys

def measure_distance():
    time.sleep(0.1)
    return randint(10,15)

while True:
    distance = measure_distance()
    print ("%s,%s" % (datetime.datetime.now(),distance))
    sys.stdout.flush()

谢谢大家的帮助。EJP解决了缓冲问题——在Python代码中添加sys.stdout.flush()解决了这个问题

至于其他问题,你是对的。我的意思是,由于我在一个单独的线程上阅读,程序的主线程可以继续执行其他逻辑

读取线程将数据累积到一个列表中,该列表由创建它的类传递给它。然后可以通过这个包装类访问这些数据,而无需等待输出完成

import time
import datetime
from random import randint
import sys

def measure_distance():
    time.sleep(0.1)
    return randint(10,15)

while True:
    distance = measure_distance()
    print ("%s,%s" % (datetime.datetime.now(),distance))
    sys.stdout.flush()

你能把再现问题所需的代码减少到绝对最小值吗?当然,吉姆,我会编辑我的原始问题。生成输出的过程是缓冲它。在Java代码中,您对此无能为力。修复Python代码。注意:从
读卡器
输入流
读取的线程都可能是非阻塞的。当您的阅读线程只是将输出累积到一个列表中时,也完全不清楚为什么缓冲很重要。您能否将再现问题所需的代码减少到绝对最小值?当然,Jim,我将编辑我的原始问题?生成输出的过程是对其进行缓冲。在Java代码中,您对此无能为力。修复Python代码。注意:从
读卡器
输入流
读取的线程都可能是非阻塞的。当您的读取线程只是将输出累积到一个列表中时,也完全不清楚为什么缓冲很重要。