작성
·
497
0
w_worker = Process(target=self.w_job, args=(w_queue,))
w_worker.start()
workers.append(w_worker)
try:
~
except KeyboardInterrupt:
for w in workers:
w.join()
안녕하세요 강사님,
w.join()에서 아래와 같은 exception이 발생하는데, 어떤 문제인지 모르겠어서 질문드립니다.
Exception ignored in atexit callback: <function _exit_function at 0x7f61a90b72e0>
Traceback (most recent call last):
File "/usr/lib/python3.10/multiprocessing/util.py", line 357, in _exit_function
p.join()
File "/usr/lib/python3.10/multiprocessing/process.py", line 149, in join
res = self._popen.wait(timeout)
File "/usr/lib/python3.10/multiprocessing/popen_fork.py", line 43, in wait
return self.poll(os.WNOHANG if timeout == 0.0 else 0)
File "/usr/lib/python3.10/multiprocessing/popen_fork.py", line 27, in poll
pid, sts = os.waitpid(self.pid, flag)
KeyboardInterrupt:
해당 에러는 어떤 부분때문에 발생하는 지, 어떤 선행작업이 필요한지 궁금합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
해당 에러는 KeyboardInterrupt 예외가 발생했을 때 프로세스(p)가 join() 메서드를 호출하려고 하면서 발생하는 것입니다. KeyboardInterrupt 예외는 사용자가 프로그램을 강제로 종료하려고 Ctrl+C를 입력했을 때 발생하는 예외입니다.
이 에러는 KeyboardInterrupt 예외가 발생하면 자동으로 생성되는 atexit 콜백 함수에서 발생하는 것으로 보입니다. 이 콜백 함수는 프로그램이 정상적으로 종료되거나 오류로 인해 종료되었을 때 호출되는 함수입니다. 프로세스가 join()을 호출하며 프로그램이 종료될 때, atexit 콜백 함수가 해당 프로세스에 대한 join()을 한 번 더 호출하려고 하면서 예외가 발생하는 것 같습니다.
이 예외를 해결하기 위해서는 프로세스가 join()을 호출할 때 현재 프로세스와 동일한 프로세스인지 확인해야 합니다. 아래와 같이 코드를 수정해 보세요.
import os
try:
~
except KeyboardInterrupt:
for w in workers:
if w.pid != os.getpid(): # 현재 프로세스가 아니면 join() 호출
w.join()
위의 코드에서 getppid()를 사용하여 현재 프로세스의 ID를 가져오고, join()을 호출하고자 하는 프로세스의 ID와 비교하여 현재 프로세스와 동일하지 않을 경우에만 join()을 호출합니다.
이렇게 수정하면 KeyboardInterrupt 예외가 발생해도 join() 호출 시 해당 예외가 발생하지 않을 것입니다. 하지만 이 예외는 프로그램 종료 시 자동으로 발생하는 것이므로, 정상적인 동작에는 영향을 주지 않을 것입니다.
더 자세한 내용이나 질문이 있으시면 언제든지 답변해드리겠습니다.