मेरा मानना है कि 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 . के अंत में समाधान करेगा (कोशिश-छोड़कर और फिर से उठाने में कॉलबैक लपेटना)।