如何停止运行Py4J ClientServer的Python

时间:2019-05-28 12:32:00

标签: java py4j

我有一个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悄然退出的任何想法?

1 个答案:

答案 0 :(得分:0)

关于管理从Java开始的python进程,我有很多代码,包括shutdownHooks,finalizers()和超时使用侦听器。原来的主要问题是,对于给定的ClientServer / Process对,我在调用Process.destroyForcfully()之前先调用ClientServer.shutdown(),在交换订单并先终止该进程之后,shutdown()不再挂在close()上。 )(请参见下文)。

如果未首先关闭套接字,则Py4J Java代码中有一条注释,内容涉及读取器挂在readLine()中。尽管先关闭此套接字,但似乎仍在挂起。下面的堆栈跟踪来自Finalizer线程,但是我也是在自己的线程中得到的。

enter image description here