मैं एक Linux RedHat VM पर Python 3.7 पर चल रहे Python डेमॉन के साथ काम कर रहा हूँ। कार्यक्रम की हिम्मत बहुत सीपीयू भारी है इसलिए मैंने मल्टीप्रोसेसिंग लागू की है, थ्रेडिंग बहुत धीमी थी। मुझे प्रोग्राम को डिमन बनाने की आवश्यकता है।

अवलोकन करने के लिए, डेमॉन डीबी से पूछताछ करता है और कतार में सभी आईडी को कतारबद्ध करता है। फिर प्रक्रिया () फ़ंक्शन प्रत्येक उत्पन्न प्रक्रिया में चलता है। कोड 1-2 प्रक्रियाओं के लिए त्रुटि के बिना काम करता है, लेकिन हम लगभग 7 चलाना चाहते हैं। मैंने नीचे दिए गए कोड को सरल बना दिया है।

जब मैं 7 प्रक्रियाओं के साथ प्रोग्राम चलाता हूं तो मुझे निम्न त्रुटि मिलती है ...

ट्रेसबैक (सबसे हालिया कॉल अंतिम): फ़ाइल "python_daemon_multiprocessv4.py", लाइन 77, प्रक्रिया में cus_runid.execute("QUERY REMOVED"); फ़ाइल "/PATH-REMOVED/jaydebeapi/init.py", लाइन 498, निष्पादन में self._prep = self._connection.jconn.prepareStatement (ऑपरेशन) jpype._jexception.java.lang.NoClassDefFoundErrorPyRaisable: java.lang.NoClassDefFoundError: com/ibm/db2/jcc/am/dg

यह एक डीबी कनेक्शन पर एक त्रुटि है, फिर से जो 1-2 प्रक्रियाओं के साथ बेकार ढंग से काम करता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि प्रक्रियाएं एक ही जेवीएम साझा कर रही हैं। यह प्रोग्राम सभी पायथन है, मैं डेटाबेस से कनेक्ट करने के लिए केवल 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 कैसे दे सकता हूं ताकि प्रक्रियाएं डीबी कनेक्शन पर न लड़ें? (मुझे पूरा यकीन है कि यही हो रहा है)

0
Joshua Hedges 14 अप्रैल 2020, 15:10

1 उत्तर

सबसे बढ़िया उत्तर

जैसा कि नोट किया गया है, पिछली पोस्ट है, मल्टीप्रोसेसिंग के साथ जेपी टाइप का उपयोग करते समय फोर्क के बजाए स्पॉन करना आवश्यक है। फोर्कड प्रतियां एक गैर-कार्यात्मक जेवीएम प्राप्त करती हैं जो यादृच्छिक मुद्दों की ओर ले जाती है।

Jpype में मल्टीप्रोसेसिंग के साथ मेमोरी लीक हो जाती है

1
Karl Nelson 17 अप्रैल 2020, 14:18