Hi there,
I am facing a problem during exception handling in multiprocessing.
A raised AttributeError looks different in multiprocessing environment.
Given the following minimal example:
import operator
from dataclasses import dataclass
import multiprocessing
@dataclass
class ClassWithAttributes:
name: str
def do_something_with_attribute(instance: ClassWithAttributes):
attributename_name:str = "name"
attrgetter_name = operator.attrgetter(attributename_name)
attributename_no_attribute:str = "no_attribute"
attrgetter_no_attribute = operator.attrgetter(attributename_no_attribute)
value_name = attrgetter_name(instance)
print(value_name)
# raises an attribute error
value_no_attribute = attrgetter_no_attribute(instance)
print(value_no_attribute)
instance1 = ClassWithAttributes("instance1_name")
instances_list = [instance1]
print("-----------------------")
print("do with for loop")
for instance in instances_list:
try:
do_something_with_attribute(instance)
except AttributeError as e:
print("Error in For Loop")
print(e.name) # here name is set
print("-----------------------")
print("do with multiprosessing")
with multiprocessing.Pool() as pool:
try:
entities_result = pool.map(do_something_with_attribute, instances_list)
except AttributeError as e:
print("Error in Multiprocessing")
print(e.name) # here name is not set
Result:
-----------------------
do with for loop
instance1_name
Error in For Loop
no_attribute
-----------------------
do with multiprosessing
instance1_name
Error in Multiprocessing
None
The object of the AttributeError in for loop looks different than in multiprocessing.
The name of the error is not set within multiprocessing.
I am not sure, if this is an expected behaviour?
Thanks and best,
Christoph