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

How do I attach new JVMs to spawned Python Processes?

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

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

当我 运行 有 7 个进程的程序时,我得到以下错误...

Traceback (most recent call last): File "python_daemon_multiprocessv4.py", line 77, in process cus_runid.execute("QUERY REMOVED”); File "/PATH-REMOVED/jaydebeapi/init.py", line 498, in execute self._prep = self._connection.jconn.prepareStatement(operation) jpype._jexception.java.lang.NoClassDefFoundErrorPyRaisable: java.lang.NoClassDefFoundError: com/ibm/db2/jcc/am/dg

这是数据库连接上的一个错误,同样可以完美地处理 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,这样进程就不会争夺数据库连接? (我很确定这就是正在发生的事情)

如前所述 post,当使用 JPype 进行多处理时,有必要生成而不是分叉。分叉副本继承了导致随机问题的非功能性 JVM。

Memory leaks in Jpype with multiprocessing