concurrent.futures
을 사용하여 여러 텍스트 파일을 읽을 때 이상한 오류가 있음을 발견했습니다.파이썬 다중 처리 경쟁 조건
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
및 file2
이 data
디렉토리에 임의의 텍스트 파일입니다 : 여기
나는 다음과 같은 오류를 얻고있다 (이 할당되기 전에 기본적으로 프로세스가 data_dir
변수를 읽으려고) :
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
내가 data_dir
할당 if __name__ == '__main__':
전에 블록을 배치 할 경우, 나는이 오류 및 얻지 않는다 코드가 예상대로 실행됩니다.
이 오류의 원인은 무엇입니까? 분명히 두 경우 모두 비동기 호출을 수행하기 전에 data_dir
이 할당됩니다.
링크를 제공해 주셔서 감사합니다! 나는이 코드가 어제 Macbook에서 잘 돌아갔다는 것을 기억한다. 그래서 오늘이 오류를 Windows 컴퓨터에서 얻는 것은 꽤 혼란 스러웠다. –
당신은 오신 것을 환영합니다! @MaxLawnboy 또한 파이썬에서'concurrent' lib가 있다는 것을 배웠습니다 .3. –