이 문서 내용은 좀 낡았습니다.
60일이나 편집 안된 오래된 망한 문서니 개발 문서인 경우 참고할 때 조심하세요. 최신 정보를 알고 싶으면 게시판에 글 써주세요
문서 편집시 멀티프로세스를 이용해서 타임아웃 체크를 하는데 그 과정에서 'str' object has no attribute 'cursor'가 발생하는 문제
2. 원인이 무엇인가 ✎ ⊖
def edit_timeout(func, args = (), timeout = 3):
pool = multiprocessing.Pool(processes = 1)
result = pool.apply_async(func, args = args)
try:
result.get(timeout = timeout)
except multiprocessing.TimeoutError:
pool.terminate()
return 1
else:
pool.close()
pool.join()
return 0
해당 파트 코드이다. multiprocessing.Pool(processes = 1) 프로세스가 1개에다가 pool.apply_async(func, args = args) edit 함수를 할당시켜서 result.get(timeout = timeout) 그 결과로 타임아웃 결과를 얻는 코드이다.
이 과정에서 할당하는 프로세스가 1개니까 메인 프로세스 그대로 이 과정을 동작하는 것을 의도로 두고 코드를 작성하였다.
이 파트의 경우 다른 프로세스를 생성해서 처리하게 되어 있는데
(1) 추정으로는 프로세스 분배에서
(2)(3) 디비 커넥션이 초기화되는? 차이에서 나오는 오류가 아닐까 싶습니다 (제 경우에는 테섭과 본섭 둘 다 뜨지 않기 때문에) 그래서 그것에 대한 주요 원인은 찾아봐야 할 것 같고
일부 상황에서 오동작하는 걸로 생각했는 데 그게 아니라 OS상의 문제였다.
2.3. 그런데 윈도우에서는 ✎ ⊖
윈도우에서는 프로세스를 1개를 할당해도 메인 프로세스 그대로 작동하는 것이 아니라 추가 프로세스 1개를 더 생성해서 동작한다. 그 결과 새롭게 생긴 프로세스에는 디비 할당이 전혀 안되어 있고 그래서 저 오류가 발생하게 된다. (왜냐하면 내가 디비 커넥션 init를 str로 할당해놨기 때문에)
2.4. 그러면 그냥 디비 커넥션을 생성하고 시작하면 되는 거 아니냐? ✎ ⊖
라고 생각해서 그것도 해봤는데 문제는 렌더러 과정에서 flask 데이터도 불러와야한다. 그래서 flask 부분도 init 되어 있지 않고 이 쪽 라우터로 접속한 걸로 인식되지 않기 때문에 렌더링 과정에서 에러가 발생한다...
3. 그래서 해결책은 ✎ ⊖
처음에 시작할 때 라우터에서 모든 걸 던져주도록 수정해야하는데... 비효율적인 것 같다... 그래서 고민 중이다.
결국 라우터에서 모든 걸 던져주도록 했다...