<commit_before>---
title: Python 3 비동기 프로그래밍
tags: [Python]
layout: post
comments: true
---

*이 글은 Python 3.7을 기준으로 작성된 글입니다.*
*Generator, Coroutine에 대해 한번도 들어보지 못하셨다면 [이전 글](/python-3-iterator-and-generator/)을 먼저 읽으시는 것을 추천드립니다.*

Python 3는 Python 2에 비해 상당히 많은 부분이 바뀌었는데 그 중 하나가 비동기 처리 지원입니다.

Python 3.4에서 `asyncio` 패키지가, 3.5에서 `async`/`await` 키워드가 추가되어 파이썬으로 비동기 프로그래밍을 하려면 3.4 이후의 버전을 사용해야합니다.

## Python과 비동기 프로그래밍

보통 우리가 생각하는 비동기 처리방식이라면 아래와 같은 이미지일 것입니다. 메인 스레드 외에 다른 스레드들이 같은 시간에 동작하는 모습이죠. 그런데 Python의 비동기 처리 방식은 조금 다릅니다.

![alt text](/images/async-programming-in-python/usual-async.png "우리가 생각하는 일반적인 비동기 처리방식")


바로 GIL(Global Interpreter Lock)이라는 녀석이 있기 때문에, Python의 스레드는 위 이미지처럼 동작하지 않습니다. 간단히 GIL의 동작 방식을 설명하자면 한 번에 한 스레드만 일을 할 수 있게 전역 인터프리터(Global Interpreter)에 락(Lock)을 거는 것입니다. GIL의 등장 이유와 어떻게 동작하는지 등 자세한 내용들은 나중에 따로 다루겠습니다. 아무튼 GIL이 있어서 실제 Python의 비동기는 아래와 같이 동작합니다.

![alt text](/images/async-programming-in-python/python-async.png "파이썬의 비동기 처리방식")

## Blocking I/O
<commit_msg>:pencil2: fix previous post link<commit_after>---
title: Python 3 비동기 프로그래밍
tags: [Python]
layout: post
comments: true
---

*이 글은 Python 3.7을 기준으로 작성된 글입니다.*
*Generator, Coroutine에 대해 한번도 들어보지 못하셨다면 [이전 글](/python-3-iterator-generator-and-coroutine/)을 먼저 읽으시는 것을 추천드립니다.*

Python 3는 Python 2에 비해 상당히 많은 부분이 바뀌었는데 그 중 하나가 비동기 처리 지원입니다.

Python 3.4에서 `asyncio` 패키지가, 3.5에서 `async`/`await` 키워드가 추가되어 파이썬으로 비동기 프로그래밍을 하려면 3.4 이후의 버전을 사용해야합니다.

## Python과 비동기 프로그래밍

보통 우리가 생각하는 비동기 처리방식이라면 아래와 같은 이미지일 것입니다. 메인 스레드 외에 다른 스레드들이 같은 시간에 동작하는 모습이죠. 그런데 Python의 비동기 처리 방식은 조금 다릅니다.

![alt text](/images/async-programming-in-python/usual-async.png "우리가 생각하는 일반적인 비동기 처리방식")


바로 GIL(Global Interpreter Lock)이라는 녀석이 있기 때문에, Python의 스레드는 위 이미지처럼 동작하지 않습니다. 간단히 GIL의 동작 방식을 설명하자면 한 번에 한 스레드만 일을 할 수 있게 전역 인터프리터(Global Interpreter)에 락(Lock)을 거는 것입니다. GIL의 등장 이유와 어떻게 동작하는지 등 자세한 내용들은 나중에 따로 다루겠습니다. 아무튼 GIL이 있어서 실제 Python의 비동기는 아래와 같이 동작합니다.

![alt text](/images/async-programming-in-python/python-async.png "파이썬의 비동기 처리방식")

## Blocking I/O

{'fraction_non_alphanumeric': 0.09521460286137148, 'fraction_numerical': 0.0123334977799704, 'mean_word_length': 3.672811059907834, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6264057', 'n_tokens_mistral': 1461, 'n_tokens_neox': 1881, 'n_words': 316}