2017-11-03 2 views
0

최근에 flask-sqlalchemy와 함께 flask-rq를 사용하여 모델 작업과 비동기 작업을 수행했습니다. Model 메서드를 호출 할 때 가끔 ResourceClosedError 오류가 발생하는 동안. 문제를 일으키는 원인은 내 rq-worker에게 무슨 일이 일어나는 지 모른다. 문제를 올바르게 재현 할 수 없습니다. 여기에 미리보기가 있습니다.flask-sqlalchemy와 함께 flask-rq를 사용하면 때때로 ResourceClosedError가 발생합니다.

worker.py

@job 
def async_restart_task(task_id): 
    creating_info = {"status": TaskStatus.Creating} 
    task = TaskModel.update_task(task_id, creating_info) 

    task = TaskModel.get_task_by_id(task_id) 
    service = get_service(task.service) 

    for jobs in iter_group(10, service.gen_jobs(task)): 
     JobModel.add_jobs(jobs) 

비동기 작업이 때때로 ResourceClosedError

ResourceClosedError: This result object does not return rows. It has been closed automatically.

,691 인상 (일부 비동기 작업을 포함)

if __name__ == '__main__': 
    with app.app_context(): 
     QUEUE = get_queue() 
     worker = get_worker() 
     worker.push_exc_handler(retry_handler) 
     worker.work() 

tasks.py

좋은 연습에 따라 문제를 해결하는 방법을 모릅니다. 나는 오랫동안 수색을 해왔고 같은 문제가있다. ref : Celery and SQLAlchemy - This result object does not return rows. It has been closed automatically

비동기 작업에서 sqlalchemy를 사용하여 이러한 경우에 대한 좋은 제안이나 예가 있습니까?

답변

0

나는 multi-processes 유스 케이스에서 flaskal-rq를 사용하여 코드를 사용하는 경우에 the same question에서 나온 sqlalchemy에 대한 좋은 요약과 제안을 얻었다. sqlalchemy의 저자 인 @zzzeek에게 감사의 말을 전합니다.

다중 프로세스 또는 작업자 간의 연결을 공유하여 sqlalchemy를 사용하면이 클래스 문제가 쉽게 발생한다는 것을 알 수 있습니다. 분기 처리 된 하위 프로세스와 같은 다른 프로세스에서 작업하려면 새 engine을 인스턴스화하는 것이 좋습니다.

celery 또는 RQ과 같은 비동기 대기열과 sqlalchemy가있는 다른 대기열을 사용할 때. 원본 Job 또는 Task 클래스를 상속하여 새로운 engine 또는 session을 새로 설치하면이 문제를 해결하는 것이 좋습니다. 이쪽으로부터 same issue

마지막으로. @zzzeek의 조언이나 메모를 따라 가려면 sqlalchemy FAQ

을 참조하십시오.
관련 문제