如何将新的 JVM 附加到生成的 Python 进程?

Posted

技术标签:

【中文标题】如何将新的 JVM 附加到生成的 Python 进程?【英文标题】:How do I attach new JVMs to spawned Python Processes? 【发布时间】:2020-04-14 12:10:52 【问题描述】:

我正在使用在 Linux RedHat VM 上的 Python 3.7 上运行的 Python 守护程序。 该程序的内容非常占用 CPU,所以我实现了多处理,线程太慢了。我需要使程序成为守护程序。

总而言之,守护进程查询数据库并将所有 id 放入队列中。然后 process() 函数在每个生成的进程中运行。该代码对 1-2 个进程没有错误,但我们想运行大约 7 个。我已经简化了下面的代码。

当我使用 7 个进程运行程序时,我收到以下错误...

Traceback(最近一次调用最后一次):文件 “python_daemon_multiprocessv4.py”,第 77 行,正在进行中 cus_runid.execute("QUERY REMOVED"); 文件“/PATH-REMOVED/jaydebeapi/init.py”,第 498 行,在执行中 self._prep = self._connection.jconn.prepareStatement(操作)jpype._jeexception.java.lang.NoClassDefFoundErrorPyRaisable: java.lang.NoClassDefFoundError: com/ibm/db2/jcc/am/dg

这是 db 连接上的错误,同样适用于 1-2 个进程。我认为是因为这些进程共享相同的 JVM。这个程序全是Python,我只用JVM连接数据库。

import time
import os
import jaydebeapi, sys
import multiprocessing

def bigsql_database_connection():
    #creates a db connection with jaydebeapi

# Multiprocessing Variables
total_processes = 7
wait = 30
queue = multiprocessing.Queue()

# define daemon cursor
conn = bigsql_database_connection()
cus=conn.cursor()

def list_unprocessed_ids():
    #returns ids to process

def process(queue):
    conn = bigsql_database_connection()
    while True:
        try:
            cus_runid=conn.cursor()
            run_id_str = str(queue.get(True))
            #here some db work and heavy data processing is completed
            cus_runid.close()
        except Exception as e:
            cus_runid.close()

def daemon():
    run_pool = multiprocessing.Pool(total_processes, process, (queue,))
    while True:
        try:
            ids_to_process = list_unprocessed_ids()
            if len(ids_to_process) >= 1:
                for id in ids_to_process:
                    queue.put(str(id))
            time.sleep(wait)
        except Exception as e:
            #handle error
    return 0

daemon()

如何为每个进程提供自己的 JVM,这样这些进程就不会争夺数据库连接? (我很确定这是正在发生的事情)

【问题讨论】:

java.lang.NoClassDefFoundError: com/ibm/db2/jcc/am/dg 听起来像是类路径/数据库驱动配置问题:***.com/questions/19128792/… 【参考方案1】:

如前一篇文章所述,当将 JPype 与多处理一起使用时,需要生成而不是分叉。分叉副本继承了一个无法正常工作的 JVM,这会导致随机问题。

Memory leaks in Jpype with multiprocessing

【讨论】:

以上是关于如何将新的 JVM 附加到生成的 Python 进程?的主要内容,如果未能解决你的问题,请参考以下文章

将新的 JavaDoc 附加到来自 super 方法的现有 JavaDoc

如何使用 pandas 将新的数据帧行附加到 csv?

如何使用 php 类 DOMDocument 将新的 xml 节点附加到现有的 .xml 文件?

如何根据 Python 中的索引时间序列条件将新数据集附加到现有数据集

如何使用 python boto3 将新角色权限附加到 aws 中的 iam_role?

将新的 Google 表格数据附加到 BigQuery 表中