이 문서 내용은 좀 낡았습니다.
60일이나 편집 안된 오래된 망한 문서니 개발 문서인 경우 참고할 때 조심하세요. 최신 정보를 알고 싶으면 게시판에 글 써주세요


목차

1. 개요
2. 원인이 무엇인가
2.1. 일단 의도한 바
2.2. 처음 원인 생각
2.3. 그런데 윈도우에서는
2.4. 그러면 그냥 디비 커넥션을 생성하고 시작하면 되는 거 아니냐?
3. 그래서 해결책은

1. 개요

문서 편집시 멀티프로세스를 이용해서 타임아웃 체크를 하는데 그 과정에서 'str' object has no attribute 'cursor'가 발생하는 문제

2. 원인이 무엇인가

2.1. 일단 의도한 바

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개니까 메인 프로세스 그대로 이 과정을 동작하는 것을 의도로 두고 코드를 작성하였다.

2.2. 처음 원인 생각

이 파트의 경우 다른 프로세스를 생성해서 처리하게 되어 있는데(1) 추정으로는 프로세스 분배에서(2)(3) 디비 커넥션이 초기화되는? 차이에서 나오는 오류가 아닐까 싶습니다 (제 경우에는 테섭과 본섭 둘 다 뜨지 않기 때문에) 그래서 그것에 대한 주요 원인은 찾아봐야 할 것 같고

일부 상황에서 오동작하는 걸로 생각했는 데 그게 아니라 OS상의 문제였다.

2.3. 그런데 윈도우에서는

윈도우에서는 프로세스를 1개를 할당해도 메인 프로세스 그대로 작동하는 것이 아니라 추가 프로세스 1개를 더 생성해서 동작한다. 그 결과 새롭게 생긴 프로세스에는 디비 할당이 전혀 안되어 있고 그래서 저 오류가 발생하게 된다. (왜냐하면 내가 디비 커넥션 init를 str로 할당해놨기 때문에)

2.4. 그러면 그냥 디비 커넥션을 생성하고 시작하면 되는 거 아니냐?

라고 생각해서 그것도 해봤는데 문제는 렌더러 과정에서 flask 데이터도 불러와야한다. 그래서 flask 부분도 init 되어 있지 않고 이 쪽 라우터로 접속한 걸로 인식되지 않기 때문에 렌더링 과정에서 에러가 발생한다...

3. 그래서 해결책은

처음에 시작할 때 라우터에서 모든 걸 던져주도록 수정해야하는데... 비효율적인 것 같다... 그래서 고민 중이다.

결국 라우터에서 모든 걸 던져주도록 했다...
(1) 코드 상에서는
(2) 코드 상에서 그렇게 되어 있으니 메인 프로세스를 안 넘기고 다른 동작을 해서
(3) 여기까진 예상대로긴 했다