[event] 이벤트 기반 프로그래밍은 이전에 다룬 한정된 파이썬 어플리케이션과는 다르다. 일반적으로 이러한 우선 프로그램은 플로우를 설정하고 메인 메모리의 실행 관점에서 프로그램의 어떤 부분이 비결정적일지라도 독립적인 접근법을 결정론적으로 따른다. 그림. 이벤트 기반 프로그램에서는 일반적으로 이벤트에 반응하는 일정한 이벤트 루프가 있다. 이벤트 루프가 시작되면, 어떤것이 실행되고 그 순서가 어떻게 되는지 결정하는 시스템상에 필요한 이벤트가 내려진다. 쉬운예로 키보드 입력을 들 수 있다. 다음에 어떤 키가 눌릴지 결정할 수는 없지만 프로그램이 key-press 이벤트에 반응했을 때 주어지는 키에 대해서 매핑되는 특정 함수를 갖는다. 그림. 이벤트 기반 프로그램이 일반적으로 따르는 흐름 구성을 볼 수 있다..
만약 1000 개의 웹 페이지를 불어와야 하는 상황이 있다. 이때 1개의 페이지를 요청하면 서버에서 처리해줘서 응답해 주는 시간은 1초라고 하자. 그러면 1000 개의 페이지를 응답 받으려면 1000 초가 걸린다. 사실 1개 요청하고 1초 동안 아무것도 안하고 기다리는 시간이 너무 아깝다. 이렇게 바쁠 때는 몸이 열개라도 모자라다는 말을 한다. [multi thread] 멀티 스레드는 실제로 몸이 10개이다. 스레드를 일꾼으로 볼 수 있다. n 개의 일꾼이 동시성을 가지고 일을 수행한다. 하지만 각 일꾼은 자기일이 끝나면 가만히 놀고 있을 수 있다. [async] 한페이지를 로딩하면서 다른 페이지를 로딩한다. 스레드는 하나지만 굉장히 빨리 다른일로 전환하여 수행한다. 이게 가능하려면 함수를 실행결과를 기..
[GIL] 자바나 C 계열의 언어를 사용하다가 파이썬을 하다보면 이해가 안되는 것이 GIL 이다. Global Interpreter Lock 의 약자로 여러개의 쓰레드가 있을때 쓰레드간의 동기화를 위해 사용되는 기술중 하나이다. GIL은 전역에 lock 을 걸어 두고 이 lock 을 점유해야만 코드를 실행할 수 있도록 제한한다. 따라서 동시에 하나 이상의 쓰레드가 실행되지 않는다. 예를들어 아래 그림과 같이 3개의 쓰레드가 분산해서 일을 처리하게 될 때도 실제로 cpu 점유할 수 있는 thread 는 하나 뿐이다. 따라서 실제로 사용하는 코어는 하나뿐인 것이다. [thread context switching] os 는 스레드 하나의 작업을 진행하기 위해 해당 스레드의 context 를 읽어오고, 다시 다..
ProcessPoolExecutor 은 기본적으로 ThreadPoolExecutor 와 동일한 기능으로 사용된다. ThreadPoolExecutor 와 마찬가지로 Executor 클래스의 하위 클래스로 많은 메소드가 동일하게 나타난다. [constructor] ProcessPoolExecutor 를 생성하는 과정은 concurrent.futures 모듈에서 클래스를 불러오는 부분과 다음과 같이 생 성자 객체 인스턴스화 하는거 빼고는 ThreadPoolExecutor 와 동일하다. from concurrent.futures import ProcessPoolExecutor import os import time def task(): print(f"executing out task on process {os...
동시성 퓨처는 파이썬 3.2 에서 새로 추가된 기능이다. 자바 기반의 배경지식이 있다면 ThreadPoolExcutor 에 대해 익숙할 것이다. 동시성 퓨처는 TheadPoolExcutor 를 파이썬에 구현한 형태다. 멀티스레드 작업을 실행할 때, 가장 많은 연산을 필요로 하는 작업은 스레드를 시작하는 것이다. TheadPoolExcutor 는 스레드 풀이 필요할 동안 이를 생성함으로써 문제를 다룬다. 사용자는 작업을 수행할 때 더 이상 스레드를 생성하거나 실행할 필요가 없으며, 덕분에 한번만 스레드를 다룬다. [TheadPoolExcutor] from concurrent.futures import ThreadPoolExecutor def task(n): print(f"task number={n}") i..
컨디션은 다른 스레드의 신호를 기다리는 동기화(sync) 프리미티브다. 예컨대, 해당 스레드가 실행을 마쳐야지만 현재 스레드가 나머지 계산을 수행할 수 있다. 컨디션을 이용하면 다수의 다른 스레드에게 노티를 주어서 같은 컨디션으로 기다리고 있는 모든 스레드를 제어할 수 있다. import threading import time def consumer(cd): print("consumer thread started") with cd: print("consumer waiting ...") cd.wait() print("consumer consumed the resource") def producer(cd): print("producer thread started ...") with cd: for _ in r..
락은 기본적으로 한 스레드에서 잠금과 해제 사이의 구간을 처리할 때, 같은 락을 열고 들어와야 하는 다른 스레드의 간섭을 배제하는 용도로 쓴다고 했다. 그런데 이 과정이 특별한 언어적인 장치가 아니라 API 콜에 의존하고 있다는 문제가 있다. 무슨 말이냐면 어떤 함수의 도입부에서 락을 걸고 리턴하기 직전에 락을 해제하는데, 이 함수가 재귀호출을 하는 경우가 있을 수 있다는 말이다. 이 경우에 첫번째 재귀 호출에서 앞서 걸린 락 때문에 스레드가 블럭되고, 영영 해당 락을 해제하지 못하는 문제가 생긴다. RLock은 이 문제를 해결하기 위한 Lock의 변종이다. RLock은 이미 잠긴 상태에서도 자신을 잠그려는 스레드가 이미 자신을 잠근 스레드라면 잠김 수를 1올리면서 즉시 리턴하는 락이다. import t..
[lock: 락] 다수의 스레드 실행으로 공유자원에 접급할 때 필요한 메커니즘이다. 이를 이해하려면 1개의 화장실과 여러 명의 사람을 생각하면 된다. 한명이 화장실에서 샤워를 하면 다른 사람이 볼 수 없게 문을 잠가야 한다. 파이썬 락은 문을 잠그는 동기화 프리미티브다. 이는 락, 언락 상태가 있고 언락 에서만 락을 요청할 수 있다. import threading import time count = 1 def worker_a(): global count while count -1..
프로그램을 작성하다 보면 동시성이 필요하게 될때가 있다. 즉 여러가지 일을 동시에 진행해야 한다. os 에서 프로세스마다 리소스를 할당해서 여러 프로세스가 동시에 실행되는데 하나의 프로세스에서 여러개의 스레드를 생성하여 동시에 작업을 수행할 수 있다. 동시성을 갖는 것이지 성능향상에서 기대를 하지 않는게 좋다. 파이썬에서 제공하는 멀티 프로세스와 다르다. 그리고 비동기 io 가 필요하다면 asyncio 모듈을 사용하는 것을 권장한다. def execute_thread(*args, **kwargs): print(f"child thread start: args={args} kwargs={kwargs}") sleep_time = random.randint(1, 3) time.sleep(sleep_time) p..
[비동기 프로그래밍: Async] 웹페이지를 불러오는 함수가 있다. 1000페이지를 불러오기 위해 시작하면 한 페이지 불러오고... 또, 한 페이지 불러오고... 또, 한페이지... 불러올 것이다.이보다 효율적으로 페이지를 불러오기 위해서는첫째, 1000페이지를 동시에 불러온다.둘째, 한 페이지를 로딩하면서 기다리는 동안 다른 페이지를 불러온다.두 가지 방식이 비슷해 보여도 일 처리하는 방식은 다르다. 1번은 멀티스레드 방식이고 2번은 비동기 프로그래밍 방식이다.이 두 개념의 차이를 이해해보자.한 회사원이 있다. 전화도 받아야 하고 결재 올려 승인을 받아야 하고 메일도 보내야 하고 고객과 만나 업무도 처리해야 한다.가끔 바쁠 때 "몸이 열 개면 좋겠다"라고 말한다. 멀티 스레드는 실제 몸이 열 개이다. ..
- Total
- Today
- Yesterday
- 문서 비교
- Tistory
- 장고 카톡 자동응답
- GIT
- 모바일 테마 적용
- 파이썬
- pycrypto
- 장고 플러스친구 자동응답
- 이미지 비교
- 플러스친구 자동응답
- 장고
- django chatbot
- 파이썬 입문
- 엑셀 비교
- admin.py
- gitlab
- 모바일 스킨 적용
- 파이썬 강좌
- PuTTYGen
- django
- Python
- 문과 코딩
- 면접답변
- wsgi
- virtualenv
- gitignore
- 면접정답
- 파이썬 독학
- chatbot
- 파이썬 프로그래밍
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |