Как мне присоединить новые JVM к порожденным Python процессам? - PullRequest
0 голосов
/ 14 апреля 2020

Я работаю с демоном 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, чтобы процессы не боролись за соединение с БД? я уверен, что это то, что происходит)

1 Ответ

1 голос
/ 17 апреля 2020

Как отмечалось в предыдущем посте, при использовании JPype с многопроцессорностью необходимо порождать, а не форкать. Разветвленные копии наследуют нефункциональную JVM, что приводит к случайным проблемам.

Утечки памяти в Jpype при многопроцессорной обработке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...