java - 如何停止 Python 运行 Py4J ClientServer
问题描述
我有一个 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 关闭挂钩来尝试杀死我已经启动的 python 进程,但它并不总是被调用。
那么,关于如何在 Java 端退出时让 python 安静退出的任何想法?
解决方案
我有很多关于管理从 Java 开始的 python 进程的代码,包括 shutdownHooks、finalizers() 和超时使用监听器。主要问题原来是对于给定的 ClientServer/Process 对,我在调用 Process.destroyForcibly() 之前调用 ClientServer.shutdown() 在交换顺序并首先终止进程之后,shutdown() 不再挂在 close( ) (见下文)。
Py4J java 代码中有一条关于如果套接字没有先关闭,readLine() 中的阅读器挂起的注释。尽管首先关闭了此套接字,但它似乎仍然挂起。下面的堆栈跟踪来自 Finalizer 线程,但我也在自己的线程中得到了这个。
推荐阅读
- javascript - 为什么我必须在 WebGL 中的每一帧重新初始化我的单元缓冲区?
- python - 我无法打印禁用文本框内的值 = Python selenium
- loops - CS50 Finance - Sell(迭代下拉菜单)
- css - 如何像“Photoshop 选择”一样为黑白虚线边框设置动画?
- flutter - 未处理的异常:MissingPluginException(在通道 plugins.flutter.io/url_launcher 上找不到方法 canLaunch 的实现)?
- c# - 在 C# 中的链表上使用 foreach。只有最后一个元素被打印
- django - 为什么我会收到名称错误?'未定义AuthorAdmin
- go - Go 整数数据竞赛
- java - 如何在 Java 中将日期时间字符串转换为 UTC?
- karate - 空手道机器人没有在“* print robot.allWindows”打印的列表中列出我的应用程序,该列表仅由脚本分叉