콘텐츠로 건너뛰기
Home » 파이썬 » Page 3

파이썬

파이썬으로 구현하는 스트림리더

파이썬에서 파일의 내용을 읽어와서 처리할 때 가장 기본적인 방법은 opne() 함수를 이용해서 파일 객체를 만들고, read() 메소드를 이용해서 파일의 전체 내용을 한 번에 읽어오는 것이다. 그런데 많은 경우에 실제로 다루는 파일은 텍스트포맷인 경우가 많다. 텍스트 포맷을 다룰 때에는 다음과 같은 몇 가지 전략이 존재한다. read()를 이용해서 파일의 전체 내용을 읽어와 하나의 문자열로 사용한다. readlines()를 이용하면 파일의 전체 내용을 읽어와서 라인 단위로 잘라 문자열의 리스트로 만들 수 있다. readline()을 이용해서 파일의 내용을 한 줄씩 읽어와서 처리한다. 실제로는 텍스트 파일을 한줄 단위로… 더 보기 »파이썬으로 구현하는 스트림리더

ZMQ의 기본 개념들

일전에 간단하게 ZMQ에 대한 기본적인 내용을 살짝 정리한 글이 있는데, 사실 ZMQ 자체를 알게 된 게 소켓 통신에 대한 내용을 알아보려 검색하다가 흘러흘러 닿은 것이었더 관계로 글 자체가 공식 문서에서 예제 몇 개를 따온 수준이었다. 이후에 조금 더 알아보니 ZMQ는 단순한 소켓 프로그래밍 API를 대체하는 것 외에 거의 같은 코드베이스로 분산처리라든지 네트워크 소켓외에도 프로세스간 스레드간 통신에 사용될 수 있는 정말 활용폭이 넓고 괜찮은 라이브러리라고 생각됐다. ZMQ 자체는 간단한 개념이며, 기본적으로 사용하는 방식이 소켓과 크게 다르지 않아서 학습 곡성도 매우 낮은데,… 더 보기 »ZMQ의 기본 개념들

작업 큐를 구현해보자 – Python

어떤 함수와 인자값을 전달해서 백그라운드에서 처리되도록 하려면 스레드를 사용해서 작업할 수 있다. 스레드를 사용하면 동시에 여러 개의 작업을 진행시키는 것도 가능하다. 문제는 데이터가 단시간에 다량으로 들어오는 경우인데, 여러 스레드가 동시에 돌아가는 경우 실질적으로는 모두 동시에 돌아가는 것이 아니라 CPU가 “매우 빠른 속도로” 각 스레드 사이의 작업을 전환해가면서 처리하게 된다. 따라서 스레드가 너무 많아지게 되면 스레드 사이의 스위칭에 많은 비용이 들어갈 뿐만 아니라 프로세스 자체가 불안정하게 된다. 한정된 스레드 개수만 사용하여 더 많은 데이터를 다루기 위해서는 스레드 풀이라고도 불리는 작업 큐를… 더 보기 »작업 큐를 구현해보자 – Python

async with : 비동기 컨텍스트 매니저

파이썬의 컨텍스트 매니저with 블럭을 적용할 수 있는 객체를 말한다. 이러한 객체들은 with 절에서 마치 블럭에 대한 데코레이터처럼 동작한다. 가장 흔한 예가 open() 함수로 생성하는 파일 입출력스트림으로, with 구문 내에서 쓰이면 블럭을 빠져나갈 때 파일을 닫는 동작을 자동으로 수행하게 된다.

with open('data.txt') as f:
  for line in f:
    print(line)

컨텍스트 매니저 객체는 __enter__(), __exit__() 두 개의 내장 메소드를 가지고 있는 것으로 간주된다. 위 코드에서는 with 다음에 나오는 open('data.txt') 라는 코드는 파일에 대한 입출력 스트림을 반환한다. 그리고 with 문을 빠져나갈 때, 파일에 대해 __exit__()가 호출되고 여기서 파일이 닫힐 것이다.

더 보기 »async with : 비동기 컨텍스트 매니저

파이썬에서 스레드 사용하기 – threading

스레드는 프로그램이 실행되는 실행 흐름의 최소 단위이다. 어떤 프로그램이 실행되면 기본적으로 해당 프로그램을 위한 프로세스가 생성된다. 그리고 다시 이 프로세스는 하나의 스레드를 만들고 (이것이 해당 프로세스의 메인 스레드가 된다.) 이 스레드를 따라 코드가 실행된다.

하나의 프로세는 한 개 이상의 스레드를 동시에 실행시킬 수 있다. 이 말은 메인 루틴이 진행하는 동안 병렬적으로 다른 함수들이 같이 실행될 수 있다는 말이다. 스레드는 프로세스에 종속되므로 프로세스 내에서 스레드가 추가로 만들어질 때 이 새로운 스레드는 프로세스의 코드와 메모리를 공유한다. (반대로 멀티프로세스는 각각 독립된 코드 및 메모리 영역을 가지고 돌아간다.) 스레드는 이처럼 동시에 같은 작업들을 처리하여 전체적인 성능을 향상시키거나 루틴의 흐름을 중단시키지 않고 별개의 작업 흐름이 서브 루틴을 실행하여 서로 다른 작업을 함께 진행할 때 사용한다.

파이썬에서 스레드를 사용할 수 있도록 해주는 모듈로 _threadthreading이 있다. _thread 모듈은 저수준의 API를 제공하고 있고, 이를 기반으로 고수준 API를 제공하는 threading 모듈이 있다. 이 글에서는 threading 모듈을 사용하여 스레드를 생성, 실행하고 락, 세마포어 등의 동기화 수단을 사용하여 실행 흐름을 제어하는 방법을 살펴보겠다.

더 보기 »파이썬에서 스레드 사용하기 – threading

bisect – 이진탐색 알고리듬

이진탐색은 데이터가 정렬된 상태일 때, 특정한 값을 매우 우수한 성능으로 탐색할 수 있는 알고리듬으로 실제로도 널리 이용된다. 이진탐색은 정렬된 데이터에서 특정한 값을 찾을 때 사람이 하는 것과 유사하게 처리되는데, 리스트의 한 가운데 지점의 값을 비교하여 찾는 값이 그보다 작으면 왼쪽에 그보다 크면 오른쪽에 있다는 것으로 탐색 범위를 매 시행마다 절반으로 줄여나가기 때문에 특히 규모가 큰 데이터에서 빠르게 조회가 가능하다는 장점이 있다.1 이전에 이진 탐색 알고리듬 적용을 위한 이진 탐색 트리 클래스를 작성하는 내용으로 포스팅을 발행한 적이 있는데, 파이썬은 bisect라는 내장… 더 보기 »bisect – 이진탐색 알고리듬

파이썬의 파일입출력 정리

프로그램에서 처리한 결과는 화면에 출력되기도 하지만, 나중에 따로 사용하기 위해서 별도의 저장 공간에 기록해 둘 필요도 있을 수 있다. 별도의 공간에 기록해두고 다시 쓴다는 것은 곧 파일의 형태로 디스크에 기록하고, 다시 파일의 내용을 읽어들일 수 있어야 한다는 것이다. 이처럼 파일에 어떤 데이터를 기록하고 다시 파일을 읽어들이는 것은 초보자가 생각하기에는 어려운 과정일 수도 있지만, 사실 “입출력”이라는 프로그램의 기본적인 기능에 관련된 부분이기 때문에 대부분의 프로그래밍 언어가 이에 대한 기본적인 API를 제공해주고 있다. 파일을 보는 시각에 대해 파일 입출력에서 API 사용법보다 중요한 것은… 더 보기 »파이썬의 파일입출력 정리

파이썬 소켓 연결 사용법

네트워크 프로그래밍 분야에서 소켓은 연결된 네트워크의 양 끝단을 추상화 시킨 개념이며, 컴퓨터의 관점에서는 네트워크로 통하는 컴퓨터의 외부와 컴퓨터 내부의 프로그램을 이어주는 인터페이스이다. 소켓의 개념에 대해서 이 글에서 모두 소상히 설명할 수는 없고, 네트워크를 통해서 바이트스트림을 주고 받을 수 있는 창구라 보면 된다. 다만 단순히 프로그램의 내부와 외부를 잇는 표준 입출력과는 달리 소켓은 네트워크의 반대편이 어디인지에 대한 정보를 가지고 있다. 즉 우리가 택배를 보낼 때 박스에 물건을 넣고 받는 사람 주소를 쓰는 것과 비슷하게 소켓은 어디로 보내지는 창구라는 것이 명시된 택배 상자 같은 것이다.

더 보기 »파이썬 소켓 연결 사용법