我有一个Java main(),它启动一个或多个Py4J、ClientServer和python实例来连接回ClientServer (它们都使用不同的端口集)。这是可行的,但是当main完成时,Java和python实例都不会退出
我将启动ClientServer,如下所示:
clientServer = new ClientServer(javaPort, GatewayServer.defaultAddress(), pythonPort,
GatewayServer.defaultAddress(), GatewayServer.DEFAULT_CONNECT_TIMEOUT,
GatewayServer.DEFAULT_READ_TIMEOUT, ServerSocketFactory.getDefault(),
SocketFactory.getDefault(), jep); 传入两个端口,启动python,如下所示:
python_classifier.gateway = ClientServer(
java_parameters=JavaParameters(port=javaPort, auto_convert=True, auto_close=True),
python_parameters=PythonParameters(port=pythonPort, daemonize=False,
daemonize_connections=True),
python_server_entry_point=python_classifier)我曾尝试设置deamonize=True,但随后连接开始失败。我还添加了一个Java shutdown钩子来尝试终止我启动的python进程,但它并不总是被调用。
那么,对于如何让python在Java端退出时安静地退出,有什么想法吗?
发布于 2019-05-28 23:20:14
我有很多关于管理从Java开始的python进程的代码,包括shutdownHooks、finalizers()和超时使用监听器。主要问题是,对于给定的ClientServer/进程对,在交换顺序并首先终止进程之后,我在调用Process.destroyForcibly()之前调用了ClientServer.shutdown(),shutdown()在close()中不再挂起(见下文)。
如果套接字没有先关闭,Py4J java代码中有一条关于readLine()中挂起的读取器的注释。尽管该套接字首先被关闭,但它似乎仍处于挂起状态。下面的堆栈跟踪来自Finalizer线程,但我也在自己的线程中获得了这一点。

https://stackoverflow.com/questions/56342374
复制相似问题