본문 바로가기
Python

Python - Error Can't pickle local object 오류 해결

by 올엠 2024. 6. 20.
반응형

Can't pickle local object 에러는 보통 멀티 프로세스 작업에서 발생하는데, 데이터 객채를 가져갈 수 없다는 의미이다.

즉 프로세스별로 오브젝트를 관리해야 하는데, 이를 공유할 수 없는 상태의 데이터라는 의미

보통 전역 데이터 등은 공유하는데 문제가 없지만, Database 오브젝트 같은 네트워크 세션을 관리하는 데이터와 같이 프로세스 간에 서로 데이터의 갱신이나 호출을 하는 경우에는 프로세스간 자원 공유의 문제이다.

 

이를 해결 하기 위해서는 함수를 프로세스 안에서 호출 해서 사용하도록 하고, 전역 변수로 선언해서 사용해야 하는데, 전역 변수 일 경우 갱신과 같은 데이터 변경에 주의하는게 좋다.

 

from sqlalchemy import create_engine
import multiprocessing

db_engine = create_engine(db_url)

pool = multiprocessing.Pool(processes=process_count)
jobs = []
for search_item in search_task_list:
    slack_discovery_token = discovery_token_lists[random.randint(0, len(discovery_token_lists)-1)]
    jobs.append(pool.apply_async(test_task, (1, 2, db_engine)))
for job in jobs:
    job.get()
pool.close()
pool.join()

 

위 코드에서 sqlalchemy의  db_engine 은 개별 프로세스에서 사용하게 되는데, 실패하게 된다.

따라서 db_engine은 개별 프로세스내 코드, 즉 test_task에서 생성해서 프로세스별로 세션 오브젝트를 관리하도록 코드를 변경해야 할 것이다.

반응형