Ich habe ein my_module
Modul mit einer my_func()
Funktion. Wenn ich diese Funktion im Elternprozess verwende, funktioniert alles gut (ich bekomme das korrekte Ergebnis von dieser Funktion). Aber wenn ich diese Funktion von Child-Prozessen aufrufen, bekomme ich diesen Fehler:Python Multiprocessing aufrufende Funktion von Modul
AttributeError: module 'my_module' has no attribute 'my_func'
Weiß jemand, was ich falsch gemacht habe? Hier ist mein Template-Code:
import pandas as pd, gc, sys, multiprocessing as mp, traceback as tb
sys.path.append('c:/my_libs/')
import my_module
def mp_func(df, i):
df['res'] = df.apply(lambda x: my_module.my_func(x, i))
return df
def other_function(df):
# do something
my_list = [1,2,3] # it can change dynamically based on previous code
df_res = pd.DataFrame()
mp_pool = mp.Pool(processes=min(len(my_list), mp.cpu_count()))
try:
for i_df in [y.get() for y in [mp_pool.apply_async(mp_func\
, [df[['my_attr']], i]) for i in my_list]]:
df_res = df_res.append(i_df)
except Exception as e:
print('Something went wrong during multiprocessing:\n', e)
print('\nFull traceback:\n', tb.format_exc())
finally:
mp_pool.close()
gc.collect()
df_res.to_csv(<...>)
if __name__ == '__main__':
df = pd.read_csv(<...>)
other_function(df)
Und my_module
Modul sieht wie folgt aus:
def my_func(x, i):
return x * i
Noch einmal, wenn ich das NICHT multiprocessed Version des gleichen Code ausführen dann alles gut funktioniert. (Ich benutze Python 3)
Vielen Dank!
Hmm, dieser Vorlagencode funktioniert perfekt ... Mein realer Code ist zu groß, komplex und "privat" zu veröffentlichen, aber ich versuche herauszufinden, was der Fehler ist ... – ragesz
Seltsam. Was passiert, wenn direkt nach Ihrer import-Anweisung sofort 'my_func' aufgerufen wird, werfen Sie einfach einen Wild-Parameter, z. 'my_func (1, 2)' - Sehen Sie, wenn Sie den gleichen Fehler bekommen. Löschen Sie my_module.pyc, um zu sehen, ob es hilft. –
Vielen Dank für Ihren Tipp. Es hat nicht direkt geholfen, aber jetzt hatte ich etwas Zeit, um das Problem zu finden. – ragesz