【问题标题】:py4j is opening too many threadspy4j 正在打开太多线程
【发布时间】:2017-09-21 23:38:01
【问题描述】:

我正在使用 py4j 从 Java 到 Python 进行通信。 我将下面的 Java 代码打包到一个 Jar 中,并使用命令 java -jar file.jar 运行 但是查看它我可以看到这个命令在单独的线程中运行了大约 30 次,尽管我调用了它一次。我怀疑它的发生是因为 py4j 的实现方式。 如何设置 py4j 使用的线程数的最大值? 我可以使用 Java 和 python 之间的什么通信来减少内存?

public static void main(String[] args) {
    final GroupTerms groupTerms = new GroupTerms();
    new GatewayServer(groupTerms).start();
  }

【问题讨论】:

    标签: java python multithreading server py4j


    【解决方案1】:

    问题很简单。以下是影响 Py4J 创建的线程数量的两个主要因素:

    1. 并发请求数。 Py4J在服务器端根据需要创建尽可能多的线程,但尽可能重用它们。例如,如果您有 10 个 Java 线程同时调用 Python,Py4J 最终可能会在 Python 端创建 10 个线程。另一个方向也是如此。
    2. Java 和 Python 之间的递归深度。 Py4J 使用的常规线程模型将为 Java 和 Python 之间的每个递归级别创建一个新线程(例如,Java 调用 Python 调用 Java 调用 Python)。您可以使用pinned-thread model 确保只创建一个线程。

    有关 Java 和 Python 代码之间交互的更多详细信息肯定有助于解决正在发生的问题。

    【讨论】:

    • 1.当我启动 Java GatewayServer 并在发送任何请求之前创建了所有 ~30 个线程。 2. Java和Python之间的递归深度是一。 Python 向 Java 发送请求并接收响应。
    • Py4J 只为服务器(这是可选的)和接收请求创建一个线程。如果您只是启动一个 GatewayServer 并且没有收到任何请求,我看不出 Py4J 最终会如何创建 30 个线程。请打开带有可重现示例的错误报告,我将对其进行研究。您确定 GatewayServer 是创建线程的那个吗,例如,如果您不创建 GroupTerms 实例并且不启动 Python 解释器,它仍然会创建 30 个线程吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    相关资源
    最近更新 更多