我正在Linux RedHat虚拟机上使用Python 3.7上运行的Python守护进程。这个程序的内核非常占用CPU,所以我实现了多处理器,线程太慢了。我需要使程序成为守护程序。
概括地说,守护进程查询DB,并将队列中的所有id排队。然后process((函数在每个派生的进程中运行。该代码可以在1-2个进程中正常运行,但我们希望运行大约7个。我已经简化了下面的代码。
当我用7个进程运行程序时,我会得到以下错误。。。
Traceback(上次调用(:文件"python_demo_multiprocessv4.py",第77行,正在处理中cus_runid.execute("QUERY REMOVED"(;文件"/PATH-REMOVED/jaydebeapi/init.py",第498行,在execute中自我_prep=自我_connection.jconn.prepareStatement(操作(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,这样进程就不会为数据库连接而争吵?(我很确定这就是正在发生的事情(
正如前一篇文章所指出的,在多处理中使用JPype时,有必要派生而不是分叉。分叉副本继承了一个非功能JVM,这会导致随机问题。
具有多处理的Jpype内存泄漏