GIL

  • GIL은 python의 메모리 관리와 깊은 연관이 있다. 따라서 python의 메모리 관리에 대해서 언급하고 넘어가고자 한다.

python의 메모리 관리

파이썬은 C, C++가 프로그래머가 직접 메모리를 관리하는 것과는 달리, 레퍼런스 카운트(Reference Counts)와 가비지 콜렉션(Automatic Garbage Collection)에 의해 관리된다.

레퍼런스 카운트(Reference Counts)

파이썬은 내부적으로 malloc()과 free()를 많이 사용하기 때문에 memory leak의 위험이 있다. 이러한 이유로 파이썬은 메모리 관리를 위해 레퍼런스 카운트를 사용한다.

레퍼런스 카운트

  • 객체에 카운트를 포함
  • 카운트는 객체가 참조될 때 증가
  • 참조가 삭제될 때 감소
  • 카운터가 0이 되면 메모리 할당 삭제

하지만 레퍼런스 카운트만으로 메모리를 관리했을 때에 약점이 있는데, 그것은 순환 참조이다.

순환 참조란 컨테이너 객체가 자기 자신을 참조하는 것이다. 자기 자신을 참조할 때 레퍼런스 카운트가 0에 도달할 수 없고 할당된 메모리를 삭제할 수 없어 memory leak이 발생한다.
파이썬은 이러한 문제를 가비지 콜렉션을 이용하여 해결한다.

가비지 콜렉션(Automatic Garbage Collection)

파이썬의 gc 모듈을 통해 가비지 콜렉터를 직접 제어할 수 있다. 파이썬에서는 Cyclic Garbage Collection을 지원하고, 이것은 참조 주기를 감지하여 메모리 누수를 예방한다.

  • 가비지 컬렉션의 기준

가비지 컬렉터는 generationthreshold 로 가비지 컬렉션 주기와 객체를 관리한다.
0세대, 1세대, 2세대로 총 3개의 영역으로 구분되며, 0세대에 가까울 수록 최근 생성된 객체, 2세대에 가까울수록 오래된 객체이다. generational hypothesis 에 따라 가비지 컬렉터는 0세대일수록 자주 가비지 컬렉션을 하도록 설계되어 있다.

  • 순환 참조 감지 방법

순환참조는 컨테이너 객체(tuple, list, set, dict, class) 에서만 발생할 수 있다. 순환참조 해결을 위해 모든 컨테이너 객체를 추적한다. 추가적인 메모리 할당을 하지 않기 위해 객체 내부 link field에 double linked list를 사용될 것이다. 컨테이너 객체가 생성될 때 컨테이너 객체 집합에 추가되고, 제거될 때 집합에서 삭제된다.

1. 객체 gc_refs 필드를 레퍼런스 카운트와 같게 설정
2. 각 객체에서 참조하고 있는 다른 컨테이너 객체를 찾고, 참조되는 컨테이너의 gc_refs를 감소시킨다.
3. gc_refs 가 0이면 컨테이너 집합 내부에서 자기들끼리 참조하고 있다는 것이므로 메모리에서 해제한다.

다시, GIL

  • GIL은 한번에 하나의 스레드만 수행할 수 있도록 인터프리터에 lock을 거는 기능이다.

  • 파이썬 객체는 가비지 컬렉션 기능을 위해, 레퍼런스 카운트를 가지고 있는데, 위에서 설명했듯이 해당 객체를 참조할 때마다 해당 값을 증가하고, 참조가 삭제될 때 감소해야 한다.

  • 멀티 스레드를 실행하게 되면, 각 thread가 공유하는 객체들에 대해 lock을 거는 경우(mutex), reference count를 변경하는 것에 있어 deadlock의 위험이 존재하기 때문에, 인터프리터 레벨에서 한 시점에 실행하는 스레드는 1개로 제한한 것이다.

  • 따라서 멀티 CPU 환경일지라도, 파이썬 thread는 1개만 실행된다.

  • 이를 해결하기 위해서 multiprocessing 라이브러리를 사용하면 개별 프로세스가 생성되고, 프로세스 별로 인터프리터 lock이 걸리기 때문에 동시에 실행이 가능하다.

  • 병렬처리에 관해서 굳이 thread가 아니더라도 multiprocessing이나 asyncio 등 많은 선택지가 있으며, 아직까지 단일 thread에서 성능을 저하시키지 않고 GIL을 개선할 수 있는 방안이 없기 때문에 GIL은 계속 유지되어 오고 있다.

Reference

 

 

'http://127.0.0.1:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

 

네이버 캠퍼스 핵데이 시작이 얼마 안 남았는데 기술 부채로 인한 문제가 심각하다.. 

대주제는 정해졌지만 소주제는 자유로 적혀 있어서 네이버 Open api를 사용하는 주제를 개인적으로 해보려고 했고,

프로젝트가 시작되기 전에 Vue.js를 써서 lean하게 구현해보려고 했는데, axios로 api를 호출하는 것에서 CORS 정책으로 인해 막혔다.

네이버 api는 타 사용자의 client id와 client secret 를 도용하여 api를 호출하는 것을 막기 위해 서버 프로그래밍을 통해서만 호출하도록 되어 있다.  으악

(https://developers.naver.com/forum/posts/26989)

 

그런데 프로젝트의 선택 요구사항에 nodejs server framework (express, koa) 혹은 serverless 구성을 택할 것으로 적혀있다.

말그대로 선택사항이라 지킬 필요는 없으나 이왕이면 다홍치마 아니겠는가.

문제는 나한테 서버는 django가 익숙하고, serverless라면 AWS Lambda 같은 것을 얘기하는 것 같은데, 전혀 경험이 없다.

 

방법은 다음 중에 택하면 될 듯하다.

  1. nodejs 서버 프레임워크를 공부한다. 커뮤니티는 express가 크고, koa는 기업 종속성이 낮아 미래가 밝다는 것 같다. 이 방안이라면 더 빠른 구현이 가능한 것을 택할 듯.

  2. AWS Lambda나 firebase에서 함수 기반으로 해결이 가능하다면 해당 플랫폼 사용.

  3. axios.get 의 경우에,  JSONP 이라는 것으로 해결이 된다는 얘기가 있어 가장 우선적으로 시도해볼 것임 -> html 문서의 script 태그는 보안정책에 적용되지 않는 점을 이용한 것 -> (05.15 추가) 서버 측에서 JSONP 형식을 지원해야 하는 단점이 있어 범용적으로 사용하기 어렵다.

  4. 프록시? -> (05.15 추가) 1번과 동일한 방법. 프록시 서버를 구축하는 것.

 

해커톤 시작되기 전에 빨리 공부해야지..

 

(참고: https://velog.io/@takeknowledge/%EB%A1%9C%EC%BB%AC%EC%97%90%EC%84%9C-CORS-policy-%EA%B4%80%EB%A0%A8-%EC%97%90%EB%9F%AC%EA%B0%80-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0-3gk4gyhreu)

'Language > JavaScript' 카테고리의 다른 글

호이스팅 (Hoisting)  (0) 2020.06.14
자바스크립트 Primitive(원시값)  (0) 2020.06.13
자바스크립트 클로저  (0) 2020.06.12
SPA란  (0) 2020.01.07

 

 

python으로 requests와 bs4 모듈을 이용하여 웹크롤링할 때에

 

requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine('ICY 401 Service Unavailable\r\n'))

 

라는 에러메세지가 뜰 때가 있었다.

 

대략 찾아보기로는 프록시 서버에 접속 요청을 보낼 때 생기는 것 같은데 해결책은 간단하다.

 

pip install fake-useragent

로 fake-useragent 모듈을 설치하고,

 

from fake_useragent import UserAgent


ua = UserAgent()
url = "주소"
headers = {'User-Agent' : ua.random}

r = requests.get(url, headers=headers)

이러한 식으로 headers에 random한 user-agent 값을 넣어서 보내면 정상적으로 실행된다.

'Language > Python' 카테고리의 다른 글

pip install - killed  (0) 2020.11.14
파이썬의 GIL 이란 무엇일까  (0) 2020.06.11

 

 

SPA란 Single Page Application의 약자로,

대표적인 라이브러리/프레임워크로 Angular, React, Vue가 있다. 

 

기존 방식과는 다르게 SPA는 페이지를 처음 한번만 로드하고, 이후 필요한 부분만 AJAX (Asynchronous Javascript And Xml) 을 이용하여 데이터를 binding한다. 

 

Vue나 React 같은 프레임워크가 궁극적으로 추구하는 목적은 

백엔드 개발 트렌드인 MVC 패턴에서 

View를 아예 분리해 하나의 Application으로 만들고

백엔드는 api형태로 동작하는 것이다.

 

 

'Language > JavaScript' 카테고리의 다른 글

호이스팅 (Hoisting)  (0) 2020.06.14
자바스크립트 Primitive(원시값)  (0) 2020.06.13
자바스크립트 클로저  (0) 2020.06.12
CORS  (0) 2020.05.04

+ Recent posts