Python 95

AsyncIO 라이브러리

- 개요병렬 처리 관점에서 I/O 작업은 I/O 작업 중에서 다른 작업을 할 수 있는지 여부에 따라 다음과 같이 구분할 수 있다Blocking I/O : I/O 작업이 완료될 때까지 스레드의 실행을 멈추고 대기 Non - Blocking I/O : I/O 작업 완료 여부와 관계없이 즉시 제어권을 반환하여 다른 작업을 계속 수행 파이썬의 AsyncIO 라이브러리에서는 내부적으로 async / await 구문을 사용하여 동시성 코드를 작성할 수 있다또, BeautifulSoup 라이브러리를 사용하면 XML이나 HTML 파일 안의 데이터를 손쉽게 파싱할 수 있다따라서 2개의 라이브러리를 사용하여 Non-Blocking I/O 예제를 작성한다 - 전역 변수...# 실행 시작 시간start = timeit.def..

Futures 모듈 (2)

- 개요이전에 여러 작업을 수행하기 위해 사용한 map 함수는 입력한 순서대로 작업을 반환한다그러나 상황에 따라서 유동적으로 작업을 수행해야 하는 경우가 존재한다이를 위해 Futures 모듈에서 2개의 함수를 사용할 수 있다map 함수 : 입력한 순서대로 작업을 반환작업의 처리 순서 보장이 필요한 경우에 사용wait 함수 : 완료된 작업의 집합과 완료되지 않은 작업의 집합을 반환작업의 상태 관리, 제어 필요한 경우에 사용as_completed 함수 : 완료되는 순서대로 작업을 반환빠른 결과부터 처리하는 경우에 사용 - 공통 요소from concurrent.futures import ThreadPoolExecutor, wait, as_completedimport timeJOBS = [100000, 1000..

Futures 모듈 (1)

- 개요concurrent.futures 모듈에서 동시성과 병렬성을 구현하는 방법은 다음과 같다ThreadPoolExecutor : 여러개의 스레드를 사용여러개의 스레드를 전환하며 작업을 진행하므로 동시성(Concurrency)을 구현함스레드들은 GIL에 의해 영향을 받아 병렬처리가 불가능파일 작업이나 네트워크 작업과 같은 I/O 작업에서는 GIL이 해제되므로 유리함 ProcessPoolExecutor : 여러개의 프로세스를 사용여러개의 프로세스를 생성하여 작업을 진행하므로 병렬성(Parallelism)을 구현함프로세스들은 자신만의 GIL을 가지므로 영향을 받지 않아 병렬처리가 가능인공지능이나 빅데이터와 같은 대규모 데이터 처리를 진행하는 CPU 바운드 작업에서 유리함 - 예제 import timefr..

Futures 모듈이란?

- 개요파이썬에는 파이썬에만 존재하는 개념인 GIL(Global Interperter Lock)이 존재한다GIL은 다수의 스레드가 기계어 번역 이전의 바이트코드를 실행하지 못하도록 막는 mutex의 일종으로서다수의 스레드가 하나의 자원에 접근하는 것을 막기 위해 자원에 락을 거는 역할을 수행한다따라서 GIL에 의해 Context 전환을 위한 비용이 발생한다이때 concurrent.futures 모듈을 통해 GIL을 우회할 수 있다 - concurrent.futures 모듈concurrent.futures 모듈은 비동기 실행을 위한 API를 사용하기 쉽도록 개선한 모듈이다해당 모듈을 사용하면 얻을 수 있는 장점은 다음과 같다복잡하게 구성된 멀티스레딩 API와 멀티프로세싱 API를 통일작업에 대한 취소 / ..

코루틴 (2)

- 개요코루틴과 관련된 예제를 진행하여 코루틴에 대해서 더 자세하게 알아본다 1) 코루틴의 상태코루틴의 처리 상황에 따라서 코루틴의 상태를 확인할 수 있다각각 다음과 같이 구성되어 있다GEN_CREATED : 최초 대기 상태 GEN_RUNNING : 실행 상태 GEN_SUSPENDED : yield 대기 상태 GEN_CLOSED : 실행 완료 상태 코루틴의 상태는 inspect 모듈의 getgeneratorstate 함수를 호출하여 확인할 수 있다 def cor2(x): print(f"Coroutine Started : {x}") y = yield x print(f"Coroutine Received : {y}") z = yield x + y print(f"Coroutine Re..

코루틴 (1)

- 개요파이썬에서 코루틴과 멀티 스레드는 여러 작업을 동시에 처리하는 동시성을 수행할 수 있는 기능이다하지만 두 기능을 사용하는 방식에서 차이점이 존재한다코루틴 : 단일 스레드에서 스택을 기반으로 동작하는 비동기 작업 yield 키워드 : 코루틴에서 사용하는 키워드로, 메인 루틴과 서브 루틴을 왕복할 수 있는 키워드멀티 스레드 : CPU 코어에서 스레드를 쪼개어 비동기 작업을 실시간으로 시분할하여 수행분할된 스레드는 OS에서 관리 - 코루틴의 예제def cor1(): print("Coroutine Started") i = yield print(F"Coroutine Received : {i}")# Generator 선언cr1 = cor1()print(cr1, type(cr1)) 위와 같이 ..

제너레이터 + itertools 모듈

- 개요컴퓨터에서 사용하는 병행성(Concurrency)과 병렬성(Parallelism)의 개념은 다음과 같다병행성 : 단일 프로그램에서 여러 작업을 동시에 수행병렬성 : 여러 컴퓨터에서 여러 작업을 동시에 수행 이때 제네레이터를 사용하면 yield 키워드를 사용하여 병행성을 구현할 수 있다 1) generator를 사용한 병행성 작업 예시def gen_ex1(): print('Start') yield 'First Step' print('Continue') yield 'Second Step' print('End')tmp = iter(gen_ex1())# 첫 번째 사용예시print(next(tmp))print(next(tmp))print(next(tmp))# 두 번째 사용예시fo..

병행성 - 기본 (2)

- 개요클래스를 통해 iterable한 객체를 사용하는 방법을 알아본다이때 다음의 2가지 방식을 사용하여 구현한다__next__ 매직 메서드를 오버라이드Generator를 사용 1) __next__ 매직 메서드를 오버라이드하여 iterable한 객체 사용class WordSplitter: def __init__(self, text): self._idx = 0 self._text = text.split(' ') def __next__(self): try: word = self._text[self._idx] except IndexError: raise StopIteration('Stop Iteration') ..

병행성 - 기본 (1)

- 개요파이썬에서 Iterator는 반복가능(iterable)한 객체를 의미하고, Generator는 iterator를 생성하는 함수를 의미한다파이썬에서 iterable한 타입의 요소들은 다음과 같은데, collections 모듈의 요소들, Sequence등이 있다 1) iterable 객체의 예시text = "qwertyuooo[asdjknzvnm,xc"print(dir(text))print(text.__iter__()) 위와 같이 text라는 이름을 지닌 문자열 인스턴스를 생성하였다dir 메서드를 사용하여 해당 인스턴스의 어트리뷰트를 출력하여 __iter__ 매직 메서드가 포함되는지 확인__iter__ 매직 메서드를 사용하여 해당 인스턴스의 Iterator를 반환 실행한 결과는 위와 같다주의해야 ..

데코레이터

- 개요데코레이터는 클로저와 동일하게 함수를 파라미터로 받아서 함수를 반환하는 함수를 의미한다하지만 데코레이터는 위의 목적말고도 함수와 메서드의 기능을 쉽게 수정하기 위한 수단으로써 사용할 수 있다 데코레이터를 사용하면서 얻을 수 있는 이점은 다음과 같다1) 코드의 가독성 및 명확성 향상 2) 높은 재사용성 및 모듈화 -> 공통의 기능을 수행하는 경우 특히 유리함 3) 유지보수 용이성 증대 4) 기존의 코드를 안전하게 수정 반대로 데코레이터의 단점은 다음과 같다1) 코드의 복잡성 증가 2) 특정 기능의 함수의 경우 단일 함수가 더 유리함 3) 디버깅이 불편함 - 데코레이터의 선언import timedef action_timer(func): def set_timer(*args): # 함수..