콘텐츠로 건너뛰기
Home » Python » 페이지 9

Python

asyncio – 일반 함수를 비동기로 사용하기

지난 글에서 urlopen()과 같은 표준 라이브러리 함수를 어떻게 비동기 코루틴처럼 asyncio에서 사용할 수 있는지 살펴보았다. aiohttp 등의 비동기 라이브러리를 사용해서 여러 핸들러를 작성해야 할 때, 이와 같은 처리를 많이 해야 한다면 빈번하게 런루프 메소드를 호출하는 것보다, 간단히 데코레이터를 만들어서 활용하는 것이 어떨까? asyncio의 이벤트 루프에는 run_in_executor(executor, fn, *args) 가 있다. 이 메소드는 concurrent.futures 모듈의 ThreadPoolExecutor나 ProcessPoolExecutor를 사용하여 일반적인 blocking 함수를 다른 스레드 및 프로세스에서 실행하도록 하고 그 자신은 처리를 기다리는 코루틴을 생성한다. 이 기능을 사용하면 일반적인 blocking-I/O 함수를 non-blocking 함수처럼… 더 보기 »asyncio – 일반 함수를 비동기로 사용하기

Python 표준 함수를 asyncio에서 비동기로 호출하는 방법

파이썬 3.4에서 asyncio 가 추가되어 I/O 바운드된 작업을 단일 스레드에서 비동기로 처리할 수 있는 방법이 생겼다. 하지만 대부분의 파이썬 내장 라이브러리 함수들은 코루틴이 아닌 일반 함수들이며, 이들은 모두 블럭킹 방식으로 동작한다. 즉 asyncio 의 비동기는 실질적으로는 I/O 액세스처럼 CPU가 관여할 필요가 없는 일들에 대해서 “병렬적으로 기다리는” 식으로 동시다발적인 처리의 전체 수행 시간을 줄이는 식으로 동작하는데, 그 중에 이런 블럭킹 함수로 처리되는 과정이 끼어 있다면 수행 시간 단축이 어렵게 된다. 런루프 이 블로그의 다른 글에서도 몇 번 이야기했듯이, 파이썬에는 GIL(전역 인터프리터… 더 보기 »Python 표준 함수를 asyncio에서 비동기로 호출하는 방법

람다표현식과 맵, 필터, 리듀스 (Python)

람다(lambda, )는 본래 수리논리학에서의 함수정의를 추상화한 형식 체계로, 간단히 말해서 이름이 없는 함수 혹은 인라인으로 정의하는 함수로 이해할 수 있다. 수학에서의 람다대수의 정의와 비슷하게 파이썬에서는 다음과 같이 람다함수를 정의한다. lambda {파라미터,…} : {표현식} 람다식은 그 자체로 표현식이며 다음 구성 요소로 작성한다. 키워드 lambda 파라미터 : 컴마로 구분되는 1개 이상의 파라미터. 파라미터는 반드시 1개 이상이어어야 한다. 콜론 : 표현식 : 파라미터와 그외 값으로 이루어지는 일련의 표현식 예를 들어 어떤 파라미터 x 에 대해서 1을 증가시킨 값을 구하는 함수는 람다대수로는 이라고 표현하며,… 더 보기 »람다표현식과 맵, 필터, 리듀스 (Python)

LCD 패널 방식으로 숫자를 표시해보기 (파이썬)

LCD 처럼 숫자를 표시하는 코드를 만들어 보자 크기와 출력할 숫자를 입력받는다. 크기는 LCD 표시 요소 하나의 크기를 가리킨다. (크기는 1~10,  숫자는 0~99,999,999)  가로선은 -, 세로선은 | 문자를 통해서 표현하며, 사이즈만큼 길이가 길어진다. 따라서 하나의 문자를 표시하기 위해서는 가로는 size + 2, 세로는 size * 2 + 3 만큼의 공간이 필요하다. 예시 – 출력: 0123456789. size: 3 — — — — — — — — | | | | | | | | | | | | | | | |… 더 보기 »LCD 패널 방식으로 숫자를 표시해보기 (파이썬)

functional python에 대한 단상

문득, 이런 생각이 들었다. temp = [] for i in range(10):   temp.append(i*i) 이 코드는 10보다 작은 완전제곱수의 리스트를 만드는 함수다. 빈 리스트를 만들고 range() 로 부터 값을 받아 제곱한 다음, 리스트에 넣는다. 이 과정은 파이썬에 익숙한 사람이라면 반복문 보다는 리스트 축약으로 표현할 것이다. temp = [i*i for i in range(10)] 파이썬 리스트 축약의 기본 컨셉은 어떤 연속열로부터 다른 리스트를 만드는 것이고 이것은 람다식을 연속열에 사상(mapping over)하는 것이다.  다른 예로, 사용자로부터 공백으로 구분되는 숫자들을 받아서 정수 리스트를 만들고자 한다면, 공백으로… 더 보기 »functional python에 대한 단상

파이썬 yield from – 다른 제너레이터에게 위임하기

파이썬에서는 어떤 함수 내부에 yield 키워드가 사용됐다면, 이 함수를 무조건 제너레이터 함수로 본다. 제너레이터 함수는 제너레이터를 만드는 함수이고, 다시 제너레이터는 어떤 값을 필요한 만큼 반복적으로 만들어내는 객체이다. 제너레이터는 일반 함수와 비슷하게 생겼지만, 함수가 return 구문을 만나면 실행이 끝나버리는데 비해, 제너레이터는 yield 구문에서 값을 외부로 내보낸 후 “일시정지” 상태가 되었다가 필요할 때 다시 실행 흐름을 이어나갈 수 있다. 필요에 따라서는 일시 정지한 제너레이터를 다시 깨울 때 값을 내부로 전달할 수 있는데, 이런 특징을 활용하면 함수를 띄워놓고 필요한 시점에 반복적으로 값을 집어넣었다가… 더 보기 »파이썬 yield from – 다른 제너레이터에게 위임하기

(Python) 데이터를 입력받는 방법을 유연하게 생각해보기

컴퓨터 프로그램은 사실상 하나의 함수와 같다. (그래서 많은 프로그램은 실행자체가 main() 과 같은 함수의 호출이기도 하다.) 프로그램은 입력장치로부터 데이터를 읽어들이고, 이 소스데이터를 가공하여 결과를 만들고, 이를 출력한다. 마치 어떤 프로그램의 실행과정은 일종의 쥬스메이커와 같다고 볼 수 있다. 과일(입력될 데이터)을 투입구에 밀어넣고 동작 버튼을 누르면 기계속으로 들어간 과일이 잘리고 눌려서 과즙이 되고, 그것이 노즐을 통해서 퐁퐁 흘러나와 컵에 담기는데, 맛있는 쥬스 대신에 데이터가 흘러나온다는 점만 다를 뿐 둘의 흐름은 똑같다.

더 보기 »(Python) 데이터를 입력받는 방법을 유연하게 생각해보기

파이썬의 반복문과 iterable에 대해

리스트, 튜플, 문자열, 사전의 공통점은? 모두 for … in 문에 사용할 수 있다는 점이다. 리스트는 for 문을 통해서 개별 원소에 대한 반복 작업을 할 수 있는데, 튜플과 문자열 역시 이와 똑같은 동작을 수행하며 사전의 경우에는 사전 내의 각 키에 대해서 순회하는 기능을 제공한다. 파이썬에서는 이와 같이 for … in 구문을 통해서 반복이 가능한 타입들을 묶어서 iterable이라고 부르는데, 이는 파이썬의 기본 개념에서 매우 중요한 위치를 차지한다. for 문의 백스테이지에 대해 for 문은 일반적인 언어에서의 대표적인 반복문이다. C언어에서는 다음과 같이 쓰인다. 아래… 더 보기 »파이썬의 반복문과 iterable에 대해

터미널에 컬러로 문자열을 출력해보자 (Python)

터미널 상에 결과를 찍어주는 간단한 프로그램을 만들 때,  특정 단어나 문장에 색을 넣어 출력하고 싶을 때가 있다. 이를 위한 Colorama 라는 패키지도 따로 있기는 한데, 사실 터미널에서 색을 입혀서 출력하는 것은 ANSI 제어 문자를 이용해서 할 수 있는 부분이라 직접 만들어 보기로 한다.
더 보기 »터미널에 컬러로 문자열을 출력해보자 (Python)

Whats new in python 3.6

파이썬 3.6에서 달라지는 점

이번주 금요일1에 파이썬 3.6이 발표될 예정이다. 몇 가지 새로워지는 변경사항에 대해 살펴보자.

새 기능들

포맷 문자열 리터럴

str.format()을 사용하던 문자열 포맷팅이 f" ... " 리터럴로 사용할 수 있게 된다. 해당 리터럴 내에서는 { } 내에 현재 스코프의 변수를 이용해서 치환될 수 있다.

name = "John"
greet = f"He said his name is {name}"
print(greet) # "He said his name is John"
width = 10
precision = 4
value = decimal.Decimal("12.34567")
print(f"result: {value: {width}.{precision}}")
# "result: 12.35"
# ^^^^^ 5

더 보기 »Whats new in python 3.6