Я работаю с демоном Python, работающим на Python 3.7 на Linux виртуальной машине RedHat. Внутренние части программы очень сильно загружают процессор, поэтому я реализовал многопроцессорность, многопоточность была слишком медленной. Я обязан сделать программу демоном.
Для обзора, демон запрашивает БД и ставит в очередь все идентификаторы в очереди. Затем функция process () запускается в каждом порожденном процессе. Код работает без ошибок для 1-2 процессов, но мы хотим запустить около 7. Я упростил приведенный ниже код.
Когда я запускаю программу с 7 процессами, я получаю следующую ошибку ...
Traceback (последний вызов был последним): файл "python_daemon_multiprocessv4.py", строка 77, в процессе cus_runid.execute ("QUERY REMOVED"); файл "/ PATH-REMOVED / jaydebeapi / init .py ", строка 498, in execute self._prep = self._connection.jconn.prepareStatement (операция) jpype._jexception. java .lang.NoClassDefFoundErrorPyRaisable: java .lang.NoClassDefFound /rmror: com / 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, чтобы процессы не боролись за соединение с БД? я уверен, что это то, что происходит)