RuntimeError: can't allocate lock 에러 (feat.병렬처리)

2022. 7. 11. 22:05· 파이썬 문법
목차
  1. 문제
  2. 해결책
  3.  
  4.  
  5. 참고

 

파이썬에서 병렬처리를 한다는 것...파이썬에 대해 좀더 deep하게 알아야하는 과정이 필요한 것 같은데?
가령 cpu나 램은 파이썬에서 어떻게 동작하는게 효율적인가 같은.
그런데 그걸 하나하나 다 뜯고 공부한 후에 프로그램을 짤 시간이 없었다. 기한 안에 어떻게든 만들어야했기에 선택권이 없는 상황에 처했다.

 

그래서 어떻게..? 그냥 했다. 무작정. 되는대로. 손이가는대로. 마음가는대로.

 

 

파이썬에서 특정 라이브러리를 꼭 써야하는 일이 있었는데 이 글에서는 geopy를 예시로 글을 써보겠다.

해당 라이브러리는 좌표계 변환을 위해 사용하는 것인데, geopy의 geodesic이 정확도가 높은 대신에 속도가 엄청나게 느리다.
어느정도 정확도를 포기하고 속도를 빠르게 하고싶다면 great_circle이라는 놈을 사용하면 된다. geodesic보다도 약 20배가량 빠르다고 한다.
하지만 난 정확도도 놓칠 수 없는 상황이었다. 조금의 오차도 허용할 수 없는...

다시 말해 geodesic을 사용하면서 속도는 빠르게 처리할 수 있게끔 해야하는 상황이었는데..
단순한 작업이지만 한번 처리하는데 속도가 오래 걸린다면 여럿이서 단순 작업을 시킨다면?
그래서 해당 작업을 병렬처리하기 위해 multiprocessing.pool.appy_async를 사용하였다.

그런데...

문제

RuntimeError: can't allocate lock 과 같은 에러가 나타났다.

저 에러가 나오는 것도 복불복이다. 병렬처리 하는 양이 어느 임계점을 넘었을 때 저 에러가 나타난다.
작업관리자(ctrl+shift+esc)를 통해 cpu와 메모리 사용량을 확인해보면 메모리만 엄청나게 먹고 cpu의 사용량이 별로 없었다.

 

어디선가 본..

그말인 즉슨 apply_async로 사용하니 리어카는 잔뜩 있지만 일하는 노예가 하나밖에 없는 상황?

내 노예가 혼자 이 많은 리어카를 짊어질 수 없다며 리어카를 던져버린 상황..?

 

 

해결책

이것저것 시도해보다가

multiprocessing.pool.map_async를 사용하는 것으로 바꾸었더니 이게 웬일...

cpu의 사용량이 급등하면서 RuntimeError: can't allocate lock 에러가 사라졌다.

 

근데 파이썬에서 cpu사용하는 것을 지양해야한다고 하는데... 이렇게 해도 되나 싶다.
일단 되니까 써먹고 있는데 이런걸 좀 자세히 알고싶은데 우찌해야할 지 모르겠는 상황이요...

 

궁금한 건 왜

  • 파이썬에서 왜 멀티스레드가 아닌 멀티프로세스를 지향하나?
  • 멀티프로세스에서 pool과 process의 정확한 차이는 뭔가? 둘다 써본 결과 pool이 확실히 더 빠르기에 pool을 쓰고는 있다지만... 
  • pool내에서 apply_async와 map_async의 차이는 뭔가?
  • cpu보다도 gpu의 처리가 훨씬 빠르다고 하는데 gpu를 끌어다 쓸 수 있는 방법은 없는가?.

 

공부해야할 것이 참 많다... 사실 재미는 있지만 ㅇ갈피를 조금 잡아줄 사람이 있으면 좋겠는 요즘이다. 

 

참고

https://stackoverflow.com/questions/57178576/speed-up-getting-distance-between-two-lat-and-lon

 

Speed up getting distance between two lat and lon

I have two DataFrame containing Lat and Lon. I want to find distance from one (Lat, Lon) pair to ALL (Lat, Lon) from another DataFrame and get the minimum. The package that I am using geopy. The co...

stackoverflow.com

 

반응형
저작자표시 (새창열림)

'파이썬 문법' 카테고리의 다른 글

파이썬 타입 지정하기  (0) 2022.07.30
언어의 성능에 일희일비 하지 말기  (0) 2022.07.24
파이썬 리스트에 요소 추가 시 주의하기 (feat.속도)  (0) 2022.07.02
논리연산자 실행시 주의사항  (0) 2019.10.04
변수(Variable)  (0) 2019.09.03
  1. 문제
  2. 해결책
  3.  
  4.  
  5. 참고
'파이썬 문법' 카테고리의 다른 글
  • 파이썬 타입 지정하기
  • 언어의 성능에 일희일비 하지 말기
  • 파이썬 리스트에 요소 추가 시 주의하기 (feat.속도)
  • 논리연산자 실행시 주의사항
sovelop
sovelop
무슨 생각을 해.. 그냥 하는거지
sovelop
so's devlog
sovelop
전체
오늘
어제
  • 분류 전체보기 (141)
    • 🔥TIL (15)
    • 생각 (5)
      • Daily Routine (0)
    • WEB (2)
    • VueJS (1)
    • 파이썬 문법 (17)
      • Django (0)
    • 알고리즘 (23)
      • 백준 알고리즘 (13)
      • 프로그래머스 (0)
      • 기타 사이트 알고리즘 (6)
    • 컴퓨터공학입문 (13)
    • Data_Analysis (9)
    • Javascript (8)
      • 문법 (8)
      • node.js (0)
    • Java (9)
      • 문법 (3)
      • Android Studio (0)
      • Algorithm (2)
    • Server (6)
      • sql (2)
      • linux (2)
    • Back-up (22)
      • Git + Github (5)
      • English (0)
      • etc (17)
    • 테크 관련 세미나 (4)
    • English (0)
    • Error (4)
    • 코테후기 (0)

블로그 메뉴

  • About me

공지사항

인기 글

태그

  • va87m
  • 무접점저소음
  • 혼공단
  • # 백준 #파이썬 #python
  • 한빛미디어
  • 코알라univ
  • 코딩좀알려주라
  • 혼공자

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
sovelop
RuntimeError: can't allocate lock 에러 (feat.병렬처리)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.