ProcessBuilder:当使用Thread setDaemon进行python时,inheritIO无法正常工作

时间:2015-11-17 23:30:51

标签: java python thrift processbuilder

我正在从Java (openjdk 1.7.0_85)运行python进程:

    ProcessBuilder pb = new ProcessBuilder(bin, processJar, Integer.toString(port), Integer.toString(portRev), path, extl, thriftc, thrifts, thriftd);
    pb.inheritIO();
    pb.redirectErrorStream(true);
    pb.directory(new File(dir));
    try {
        logger.trace("Start process");
        lock.lock();
        process = pb.start();
        cond.await();
        lock.unlock();
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }

我设置pb.inheritIO()将python打印重定向到标准输出。如果我的python进程做了一些简单的事情,流的重定向就会按预期工作。

我正在使用thriftpy (0.3.2)进行Java-Python通信。 Python进程在一个线程中打开一个thrift服务器:

def __run_server(self, serverport):
    t = Globals.thrifts.split(',')
    thrifts = thriftpy.load(t[0], module_name="processsideserver_thrift", include_dirs=[t[1]])
    self.server = make_server(thrifts.ProcessSideServer, self, '127.0.0.1', serverport)

def run(self):
    if self.can_run == True:
        self.running = True
        try:
            self.server.serve()
        except Exception:
            ''

因为self.server.serve()是阻止函数。由于这条线,我的流重定向停止工作。应用程序和Java-Python通信工作正常。但是在控制台中没有显示python打印。

Thrifpy代码如下:

 def serve(self):
    self.trans.listen()
    while not self.closed:
        try:
            client = self.trans.accept()
            t = threading.Thread(target=self.handle, args=(client,))
            t.setDaemon(self.daemon)
            t.start()
        except KeyboardInterrupt:
            raise
        except Exception as x:
            logging.exception(x)

为什么会这样?因为deamon线程?我怎么能强制重定向流?

0 个答案:

没有答案