gpt4 book ai didi

java - 如何停止Python运行Py4J ClientServer

转载 作者:行者123 更新时间:2023-11-30 05:37:16 27 4
gpt4 key购买 nike

我有一个 Java main(),它正在启动一个或多个 Py4J ClientServer 和 python 实例以连接回 ClientServer(全部使用不同的端口集)。这是可行的,但是当 main 完成时,Java 和 python 实例都没有退出

我按如下方式启动客户端服务器:

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 hook 来尝试终止我启动的 python 进程,但它并不总是被调用。

那么,关于如何在 Java 端退出时让 python 安静退出,有什么想法吗?

最佳答案

我有很多关于管理从 Java 开始的 python 进程的代码,包括 shutdownHooks、finalizers() 和超时使用监听器。主要问题是,对于给定的 ClientServer/Process 对,我在调用 Process.destroyForcously() 之前调用 ClientServer.shutdown() 在交换顺序并首先终止进程之后, shutdown() 不再挂起在 close( )(见下文)。

Py4J java 代码中有一条注释,说明如果未先关闭套接字,则读取器会卡在 readLine() 中。尽管首先关闭了该套接字,但它似乎仍然挂起。下面的堆栈跟踪来自 Finalizer 线程,但我也在自己的线程中得到了它。

enter image description here

关于java - 如何停止Python运行Py4J ClientServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56342374/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com