Ich entdeckte einen seltsamen Fehler bei der Verwendung concurrent.futures
aus mehreren Textdateien lesen.Python Multiprozessing Race-Bedingung
Hier ist ein kleines reproduzierbares Beispiel:
import os
import concurrent.futures
def read_file(file):
with open(os.path.join(data_dir, file),buffering=1000) as f:
for row in f:
try:
print(row)
except Exception as e:
print(str(e))
if __name__ == '__main__':
data_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), 'data'))
files = ['file1', 'file2']
with concurrent.futures.ProcessPoolExecutor() as executor:
for file,_ in zip(files,executor.map(read_file,files)):
pass
file1
und file2
beliebige Textdateien im Verzeichnis data
.
mir die folgende Fehlermeldung erhalten (im Grunde ein Prozess versucht, data_dir
Variable zu lesen, bevor sie zugeordnet ist):
concurrent.futures.process._RemoteTraceback:
"""
Traceback (most recent call last):
File "C:\Users\my_username\AppData\Local\Continuum\Anaconda3\lib\concurrent\futures\process.py", line 175, in _process_worker
r = call_item.fn(*call_item.args, **call_item.kwargs)
File "C:\Users\my_username\AppData\Local\Continuum\Anaconda3\lib\concurrent\futures\process.py", line 153, in _process_chunk
return [fn(*args) for args in chunk]
File "C:\Users\my_username\AppData\Local\Continuum\Anaconda3\lib\concurrent\futures\process.py", line 153, in <listcomp>
return [fn(*args) for args in chunk]
File "C:\Users\my_username\Downloads\example.py", line 5, in read_file
with open(os.path.join(data_dir, file),buffering=1000) as f:
NameError: name 'data_dir' is not defined
"""
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "example.py", line 16, in <module>
for file,_ in zip(files,executor.map(read_file,files)):
File "C:\Users\my_username\AppData\Local\Continuum\Anaconda3\lib\concurrent\futures\_base.py", line 556, in result_iterator
yield future.result()
File "C:\Users\my_username\AppData\Local\Continuum\Anaconda3\lib\concurrent\futures\_base.py", line 405, in result
return self.__get_result()
File "C:\Users\my_username\AppData\Local\Continuum\Anaconda3\lib\concurrent\futures\_base.py", line 357, in __get_result
raise self._exception
NameError: name 'data_dir' is not defined
Wenn ich data_dir
Zuordnung vor if __name__ == '__main__':
Block platzieren, ich habe nicht diesen Fehler und die Code wird wie erwartet ausgeführt.
Was verursacht diesen Fehler? Offensichtlich wird data_dir
zugewiesen, bevor irgendwelche asynchronen Aufrufe in beiden Fällen vorgenommen werden sollten.
Danke für den Link! Ich erinnere mich, dass dieser Code gestern auf meinem Macbook lief, also war es ziemlich verwirrend, diesen Fehler heute auf einem Windows-Rechner zu bekommen. –
Sie sind herzlich willkommen! @MaxLawnboy Ich habe auch gelernt, dass es eine "gleichzeitige" lib in python3 gibt. –