언어/파이썬 & 장고
-
[Python] Tip - 지역시간은 time이 아닌 datetime으로 표현언어/파이썬 & 장고 2017. 1. 7. 16:28
협정 세계시(UTC)는 시간대에 의존하지 않는 표준 시간 표현입니다. UTC는 유닉스 기원 이후로 지나간 초로 시간을 표현하는 컴퓨터에서 잘 동작합니다. 하지만 사람에게는 잘 맞지 않습니다. 사람이 사용하는 시간은 현재 있는 위치를 기준으로 합니다. 사람들은 'UTC, 15:00 - 7시'가 아니라 '정오' 혹은 '오전 8시'라고 말합니다. 프로그램에서 시간을 처리해야 한다면 사람이 이해하기 쉽게 UTC와 지역 시간 사이에서 변환해야 합니다.파이썬은 두 가지 시간대 변환 방법을 제공합니다. 내장 모듈 time을 사용하는 이전 방법은 치명적인 오류가 일어날 가능성이 큽니다. 내장 모듈 datetime을 사용하는 새로운 방법은 커뮤니티에서 만든 pytz 패키지의 도움을 받아 훌륭하게 동작합니다.datetim..
-
[Python] Tip - copyreg로 pickle을 신뢰할 수 있게 하기언어/파이썬 & 장고 2017. 1. 7. 15:51
내장모듈 pickle은 파이썬 객체를 스트림으로 직렬화하거나 바이트를 객체로 역직렬화하는 데 사용합니다. pickle로 만든 바이트 스트림을 신뢰할 수 없는 부분과 통신하는 데 사용하면 안됩니다. pickle의 목적은 바이너리 채널을 통해 사용자가 제어하는 프로그램 간에 파이썬 객체를 넘겨주는 것입니다.pickle 모듈의 직렬화 포맷은 설계 관점에서 안전하지 못합니다. 직렬화한 데이터는 원래의 파이썬 객체를 재구성하는 데 필요한 프로그램을 담습니다. 이는 악성 pickle 페이로드(payload)로 파이썬 프로그램에서 해당 페이로드를 역직렬화하는 부분을 망가뜨릴 수 있음을 의미합니다.이와 달리 json 모듈은 설계 관점에서 안전합니다. 직렬화된 JSON 데이터는 객체 계층에 대한 간단한 설명을 포함합니다..
-
[Python] Tip - 재사용 가능한 try/finally 동작을 만들려면 contextlib와 with 문을 고려언어/파이썬 & 장고 2017. 1. 6. 22:27
파이썬의 with 문은 코드를 특별한 컨텍스트에서 실행함을 나타내는 데 사용합니다. 예를 들면 with문에 상호 배제 잠금을 사용하여 잠금이 설정되어 있는 동안만 들여 쓴 코드를 실행함을 나타냅니다.lock = Lock() with lock: print('Lock is held') Lock 클래스가 with 문을 제대로 지원하는 덕분에 위의 코드는 다음의 try/finally 구문에 상응합니다.lock.acquire() try: print('Lock is held') finally: lock.release() try/finally 구문에서 반복되는 코드를 작성할 필요가 없는 with 문 버전이 더 낫습니다. 내장 모듈 contextlib를 사용하면 객체와 함수를 with 문에 사용할 수 있게 만들기가 쉽..
-
[Python] Tip - functools.wraps로 함수 데코레이터를 정의언어/파이썬 & 장고 2017. 1. 6. 21:33
파이썬에는 함수에 적용할 수 있는 데코레이터라는 특별한 문법이 있습니다. 데코레이터는 감싸고 있는 함수를 호출하기 전이나 후에 추가로 코드를 실행하는 기능을 갖췄습니다. 이 기능으로 입력 인수와 반환 값을 접근하거나 수정할 수 있습니다. 이 기능은 시맨틱 강조, 디버깅, 함수 등록을 비롯해 여러 상황에 유용합니다.예를 들어 함수를 호출할 때 인수와 반한 값을 출력하고 싶다고 가정합니다. 특히, 재귀 호출에서 함수 호출의 스택을 디버깅할 때 도움이 됩니다. 그럼 이런 데코레이터를 정의해보겠습니다.def trace(func): def wrapper(*args, **kwargs): result = func(*args, **kwargs) print('%s(%r, %r) -> %r' % (func.__name__..
-
[Python] Tip - 진정한 병렬성을 실현하려면 concurrent.futures를 고려언어/파이썬 & 장고 2017. 1. 6. 21:13
파이썬 프로그램을 작성할 때 성능을 충족해야 하는 경우가 있습니다. 코드를 최적화한 이후 조차도 프로그램이 여전히 원하는 수준보다 훨씬 느리게 실행할 수도 있습니다. CPU의 코어 수가 늘어나는 현대의 컴퓨터에서는 병렬성이 한 가지 해결책이라고 봐도 무방합니다. 코드의 연산 부분을 여러 CPU 코어에서 동시에 실행할 수 있게 독립적으로 동작하는 부분으로 나눈다면 어떨까요? 불행하게도 파이썬의 전역 인터프리터 잠금(GIL)이 스레드에서 진정한 병렬성을 막으므로 이 옵션은 사용할 수 없습니다. 일반적으로 제안할 수 있는 다른 방법은 가장 성능이 중요한 코드를 C언어 확장 모듈로 재작성하는 것입니다. C로 작성하면 하드웨어에 더 가까워지고 파이썬보다 빨리 실행할 수 있어서 병렬화할 필요가 없어집니다. C확장도..
-
[Python] Tip - 많은 함수를 동시에 실행하려면 코루틴을 고려언어/파이썬 & 장고 2017. 1. 6. 20:35
파이썬 프로그래머는 스레드를 사용하여 여러 기능을 동시에 실행하는 것처럼 보여줄 수 있습니다. 하지만 스레드를 사용하는 데는 크게 세 가지 문제가 있습니다.스레드들이 서로 안전하게 동작하도록 조율하려면 특별한 도구가 필요합니다. 따라서 스레드를 사용하는 코드가 절차적인 싱글 스레드 코드보다 이해하기 어렵습니다. 또한 이런 복잡성 때문에 시간이 지날수록 스레드 코드를 확장하거나 유지보수하기 어렵습니다.스레드에는 메모리가 많이 필요합니다 (스레드당 약 8MB 정도). 많은 컴퓨터에서 스레드를 수십 개 가량 실행할 때는 문제가 되지 않습니다. 하지만 프로그램이 함수 수천 개를 동시에 실행한다면 문제가 발생합니다. 이러한 함수는 사용자가 서버에 보내는 요청, 화면의 픽셀, 시뮬레이션의 입자에 대응할지도 모릅니다..
-
[Django] uWSGI - ssl error decryption failed or bad record mac 에러 해결법언어/파이썬 & 장고 2017. 1. 6. 17:57
ssl error decryption failed or bad record mac 에러는 PostgreSQL의 isolation level을 설정할 때에 나는 에러입니다. self.conn.set_isolation_level(_ext.ISOLATION_LEVEL_AUTOCOMMIT) 과 같은 로직이 있는데 해당 부분이 에러를 낼 때도 있고 내지 않을 때도 있습니다. 원인이 문제는 uWSGI의 fork가 끝날 때 발생합니다. 마스터 프로세스로 여러 프로세스들에 대해 작업이 진행될 때, uWSGI는 마스터 프로세스 내의 어플리케이션들을 초기화하고 각각의 worker 프로세스로 어플리케이션을 복사합니다. 여기서 문제는 만약 어플리케이션을 초기화 할 때, 데이터베이스의 connection이 open된다면 여러 ..
-
[Python] Tip - 스레드 간 작업을 조율하려면 Queue를 사용언어/파이썬 & 장고 2016. 12. 10. 01:48
많은 작업을 동시에 실행하는 파이썬 프로그램에서는 종종 작업들을 조율해 줘야합니다. 가장 유용한 병행 작업 방식 중 하나는 함수의 파이프라인입니다.파이프라인은 제조 공장에서 사용하는 조립 라인처럼 작동합니다. 파이프라인은 일렬로 이어진 단계들로 구성되며, 각 단계에는 특정 함수가 연결되어 있습니다. 새 작업 요소는 끊임없이 파이프라인의 앞쪽에 추가됩니다. 각 함수는 동시에 자신이 속한 단계에 배정된 작업 요소를 처리할 수 있습니다. 남아 있는 단계가 더는 없을 때까지, 각 함수에서 처리를 완료할 때마다 작업은 다음 단계로 이동합니다. 이 방법은 파이썬으로 쉽게 병렬화할 수 있는 블로킹 I/O나 서브프로세스를 이용하는 작업에 특히 잘 맞습니다. 예를 들어 디지털 카메라에서 끊임없이 이미지들을 가져와 리사이..
-
[Python] Tip - 스레드에서 데이터 경쟁을 막으려면 Lock을 사용언어/파이썬 & 장고 2016. 12. 10. 00:52
전역 인터프리터 잠금을 배우고 나면, 많은 신참 파이썬 프로그래머가 코드에서 상호 배제 잠금(뮤텍스)을 사용하지 않아도 될 것이라고 생각할지도 모릅니다. 파이썬 스레드가 여러 CPU 코어에서 병렬로 실행하는 것을 GIL이 이미 막았다면 플그램의 자료 구조에도 잠금이 설정되었을 것이라고 생각하기 때문입니다. 리스트나 딕셔너리 같은 타입에서 테스트해보면 이런 가정을 따라도 될 것처럼 보입니다.하지만 실제로는 그렇지 않습니다. GIL은 이러한 환경을 보호해주지 못합니다. 비록 파이썬 스레드가 한 번에 하나만 실행되지만, 파이썬 인터프리터에서 자료구조를 다루는 스레드 연산은 두 바이트코드 명령어 사이에서 인터럽트될 수 있습니다. 여러 스레드에서 동시에 같은 객체에 접근한다면 이런 가정은 위험합니다. 자료구조의 ..
-
[Python] Tip - 스레드를 블로킹 I/O용으로 사용하고 병렬화용으로 사용하지 않기언어/파이썬 & 장고 2016. 12. 9. 22:42
파이썬의 표준구현을 CPython이라고 합니다. CPython은 파이썬 프로그램을 두 단계로 실행합니다. 먼저 소스 텍스트를 바이트코드로 파싱하고 컴파일합니다. 그런 다음 스택 기반 인터프리터로 바이트코드를 실행합니다. 바이트코드 인터프리터는 파이썬 프로그램이 실행되는 동안 지속되고, 일관성 있는 상태를 유지합니다. 파이썬은 전역 인터프리터 잠금(GIL, Global Interpreter Lock)이라는 메커니즘으로 일관성을 유지합니다.본질적으로 GIL은 상호 배제 잠금(mutex)이며 CPython이 선점형 멀티스레딩의 영향을 받지 않게 막아줍니다. 선점형 멀티스레딩(preemptive multithreading)은 한 스레드가 다른 스레드를 인터럽트해서 프로그램의 제어를 얻는 것을 말합니다. 이 인터..