如何将新的 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
我正在 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