PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

SQLAlchemy और मल्टीप्रोसेसिंग का उपयोग करके Python स्क्रिप्ट में हैंग करें

मेरा मानना ​​है कि TypeError multiprocessing . से आता है का get

मैंने आपकी स्क्रिप्ट से सभी DB कोड निकाल दिए हैं। इस पर एक नज़र डालें:

import multiprocessing
import sqlalchemy.exc

def do(kwargs):
    i = kwargs['i']
    print i
    raise sqlalchemy.exc.ProgrammingError("", {}, None)
    return i


pool = multiprocessing.Pool(processes=5)               # start 4 worker processes
results = []
arglist = []
for i in range(10):
    arglist.append({'i':i})
r = pool.map_async(do, arglist, callback=results.append) # evaluate "f(10)" asynchronously

# Use get or wait?
# r.get()
r.wait()

pool.close()
pool.join()
print results

r.wait . का उपयोग करना अपेक्षित परिणाम देता है, लेकिन r.get . का उपयोग करके TypeError बढ़ाता है . जैसा कि पायथन के डॉक्स में वर्णित है , r.wait . का उपयोग करें map_async . के बाद ।

संपादित करें :मुझे अपने पिछले उत्तर में संशोधन करना है। अब मुझे विश्वास है कि TypeError SQLAlchemy से आता है। मैंने त्रुटि को पुन:उत्पन्न करने के लिए अपनी स्क्रिप्ट में संशोधन किया है।

2 संपादित करें :ऐसा लगता है कि समस्या यह है कि multiprocessing.pool यदि कोई कार्यकर्ता एक अपवाद उठाता है, जिसके निर्माता को एक पैरामीटर की आवश्यकता होती है, तो यह अच्छा नहीं खेलता है (यह भी देखें यहां )।

मैंने इसे हाइलाइट करने के लिए अपनी स्क्रिप्ट में संशोधन किया है।

import multiprocessing

class BadExc(Exception):
    def __init__(self, a):
        '''Non-optional param in the constructor.'''
        self.a = a

class GoodExc(Exception):
    def __init__(self, a=None):
        '''Optional param in the constructor.'''
        self.a = a

def do(kwargs):
    i = kwargs['i']
    print i
    raise BadExc('a')
    # raise GoodExc('a')
    return i

pool = multiprocessing.Pool(processes=5)
results = []
arglist = []
for i in range(10):
    arglist.append({'i':i})
r = pool.map_async(do, arglist, callback=results.append)
try:
    # set a timeout in order to be able to catch C-c
    r.get(1e100)
except KeyboardInterrupt:
    pass
print results

आपके मामले में, यह देखते हुए कि आपका कोड SQLAlchemy अपवाद उठाता है, एकमात्र समाधान जो मैं सोच सकता हूं वह है do में सभी अपवादों को पकड़ना एक सामान्य Exception को फिर से काम करें और फिर से उठाएं बजाय। कुछ इस तरह:

import multiprocessing

class BadExc(Exception):
    def __init__(self, a):
        '''Non-optional param in the constructor.'''
        self.a = a

def do(kwargs):
    try:
        i = kwargs['i']
        print i
        raise BadExc('a')
        return i
    except Exception as e:
        raise Exception(repr(e))

pool = multiprocessing.Pool(processes=5)
results = []
arglist = []
for i in range(10):
    arglist.append({'i':i})
r = pool.map_async(do, arglist, callback=results.append)
try:
    # set a timeout in order to be able to catch C-c
    r.get(1e100)
except KeyboardInterrupt:
    pass
print results

3 संपादित करें :तो, यह एक पायथन वाला बग लगता है , लेकिन SQLAlchemy में उचित अपवाद इसे हल कर देंगे:इसलिए, मैंने इस मुद्दे को SQLAlchemy के साथ उठाया है , भी।

समस्या के समाधान के रूप में, मुझे लगता है कि संपादित करें 2 . के अंत में समाधान करेगा (कोशिश-छोड़कर और फिर से उठाने में कॉलबैक लपेटना)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Amazon Redshift में पूर्णांक रूपांतरण के लिए हेक्स स्ट्रिंग

  2. Postgresql 11:संग्रहीत प्रक्रिया कॉल त्रुटि - एक प्रक्रिया को कॉल करने के लिए, कॉल, जावा का उपयोग करें

  3. कैसे एक डोकर कंटेनर से एक Postgresql डंप उत्पन्न करने के लिए?

  4. PostgreSQL कॉपी के लिए CSV से स्कीमा कैसे जेनरेट करें

  5. टूटे हुए पीएल/रूबी के विकल्प:वेयरहाउस जर्नल टेबल को कनवर्ट करें