我有一个Java main()正在启动一个或多个Py4J ClientServer和python实例以连接回ClientServer(均使用不同的端口集)。这是可行的,但是当主要完成时,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悄然退出的任何想法?
答案 0 :(得分:0)
关于管理从Java开始的python进程,我有很多代码,包括shutdownHooks,finalizers()和超时使用侦听器。原来的主要问题是,对于给定的ClientServer / Process对,我在调用Process.destroyForcfully()之前先调用ClientServer.shutdown(),在交换订单并先终止该进程之后,shutdown()不再挂在close()上。 )(请参见下文)。
如果未首先关闭套接字,则Py4J Java代码中有一条注释,内容涉及读取器挂在readLine()中。尽管先关闭此套接字,但似乎仍在挂起。下面的堆栈跟踪来自Finalizer线程,但是我也是在自己的线程中得到的。