我正在使用在 Linux RedHat VM 上的 Python 3.7 上运行的 Python 守护程序。该程序的内容非常占用 CPU,所以我实现了多处理,线程太慢了。我需要使程序成为守护程序。
总而言之,守护进程查询数据库并将所有 id 排入队列。然后 process() 函数在每个生成的进程中运行。该代码对 1-2 个进程没有错误,但我们想运行大约 7 个。我简化了下面的代码。
当我使用 7 个进程运行程序时,出现以下错误...
回溯(最后一次调用):文件“python_daemon_multiprocessv4.py”,第 77 行,进程中 cus_runid.execute(“QUERY REMOVED”);文件“/PATH-REMOVED/jaydebeapi/ init .py”,第 498 行,执行自身._prep = self._connection.jconn.prepareStatement(operation) jpype._jexception.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,这样进程就不会争夺数据库连接?(我很确定这是正在发生的事情)