멀티 프로세싱 풀 모듈을 시험 할 때 어떤 종류의 파일도로드 / 열 때 작동하지 않는다는 것을 알았습니다. 아래 코드는 예상대로 작동합니다. 8-9 행의 주석 처리를 제거하면 스크립트가 pool.apply_async
메서드를 건너 뛰고 loopingTest
실행되지 않습니다.
import time
from multiprocessing import Pool
class MultiClass:
def __init__(self):
file = 'test.txt'
# with open(file, 'r') as f: # This is the culprit
# self.d = f
self.n = 50000000
self.cases = ['1st time', '2nd time']
self.multiProc(self.cases)
print("It's done")
def loopingTest(self, cases):
print(f"looping start for {cases}")
n = self.n
while n > 0:
n -= 1
print(f"looping done for {cases}")
def multiProc(self, cases):
test = False
pool = Pool(processes=2)
if not test:
for i in cases:
pool.apply_async(self.loopingTest, (i,))
pool.close()
pool.join()
if __name__ == '__main__':
start = time.time()
w = MultiClass()
end = time.time()
print(f'Script finished in {end - start} seconds')
이 동작 apply_async
은 파일 설명자 ( self.d
)를 인스턴스에 저장할 때 호출 이 실패 하기 때문에 표시 됩니다 . 를 호출 할 때 apply_async(self.loopingTest, ...)
Python은이 self.loopingTest
를 작업자 프로세스로 보내기 위해 피클해야하며 ,이 역시 피클 링이 필요합니다 self
. 열린 파일 설명자를의 속성으로 저장 self
하면 파일 설명자를 피클 할 수 없기 때문에 피클 링이 실패합니다. 샘플 코드 apply
대신 사용하면 직접 확인할 수 있습니다 apply_async
. 다음과 같은 오류가 발생합니다.
Traceback (most recent call last):
File "a.py", line 36, in <module>
w = MultiClass()
File "a.py", line 12, in __init__
self.multiProc(self.cases)
File "a.py", line 28, in multiProc
out.get()
File "/usr/lib/python3.6/multiprocessing/pool.py", line 644, in get
raise self._value
File "/usr/lib/python3.6/multiprocessing/pool.py", line 424, in _handle_tasks
put(task)
File "/usr/lib/python3.6/multiprocessing/connection.py", line 206, in send
self._send_bytes(_ForkingPickler.dumps(obj))
File "/usr/lib/python3.6/multiprocessing/reduction.py", line 51, in dumps
cls(buf, protocol).dump(obj)
TypeError: cannot serialize '_io.TextIOWrapper' object
파일 설명자를에 저장하지 self
않고 작업자 메서드에서만 생성하거나 (사용해야하는 경우) Python이 제공하는 도구 를 사용 하여 클래스의 피클 / 피클 해제 프로세스를 제어하여 코드를 변경해야합니다. 사용 사례에 따라 전달하는 메서드를 apply_async
최상위 함수로 전환 할 수도 있으므로 self
전혀 피클 할 필요가 없습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다