일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 스칼라 동시성
- 하이퍼레저 패브릭
- Golang
- 파이썬 강좌
- hyperledger fabric
- 파이썬 동시성
- 안드로이드 웹뷰
- 파이썬
- Play2
- 그라파나
- play2 강좌
- 엔터프라이즈 블록체인
- Hyperledger fabric gossip protocol
- CORDA
- Adapter 패턴
- 파이썬 머신러닝
- 파이썬 데이터분석
- Actor
- 스칼라 강좌
- akka 강좌
- 스칼라
- 스위프트
- 주키퍼
- 이더리움
- 플레이프레임워크
- Play2 로 웹 개발
- 하이브리드앱
- 블록체인
- play 강좌
- Akka
- Today
- Total
HAMA 블로그
파이썬 동시성 프로그래밍 - (8) Concurrent.Futures & ProcessPoolExecutor 본문
파이썬 동시성 프로그래밍 - (8) Concurrent.Futures & ProcessPoolExecutor
[하마] 이승현 (wowlsh93@gmail.com) 2017. 4. 27. 16:09
연재 순서
1. threading
2. Condition & Semaphore
3. Queue
4. multiprocessing
5. 비동기 (gevent)
6. 분산 (celery)
7. GPGPU (PyCUDA)
8. 코루틴,asyncio,async/awit
9. concurrent.future
연재 순서
1. threading
2. Condition & Semaphore
3. Queue
4. multiprocessing
5. 비동기 (gevent)
6. 분산 (celery)
7. GPGPU (PyCUDA)
8. 코루틴,asyncio,async/awit
9. concurrent.future
[번역]
concurrent.futures 모듈은 비동기 작업을 시작하기 위한 높은 수준의 API를 제공하는 표준 라이브러리의 일부입니다. 이 모듈의 일반적인 사용법에 대한 코드 샘플을 살펴 보겠습니다.
Executors
ThreadPoolExecutor
코드를 보시죠
먼저 스레드 3개를 가진 ThreadPoolExecutor를 만듭니다. 그런 다음 풀에 작업을 제출하여 5초 후에 첫 번째 인수로 전달 된 메시지를 다시 반환 받게 됩니다. 키 포인트는 태스크를 제출하고 나서 future를 되돌려 받는 코드에 있는데요. Doc에서 볼 수 있듯이 Future 객체에는 태스크가 해결되었는지, 즉 해당 future 객체에 대한 값이 설정되었는지 알려주는 done () 메서드가 있습니다. 태스크가 완료되면 (값을 리턴하거나 예외로 인터럽트 된 경우), 스레드 풀 실행 프로그램은 값을 future 오브젝트에 설정합니다.
위의 예에서 작업은 5 초가 경과 할 때까지 완료되지 않으므로 done()을 처음 호출하면 False가 반환됩니다. 그리고 잠시 대기한 후에 result () 메소드를 호출하여 future의 결과를 얻을 수 있습니다.
Future 객체를 잘 이해하고 그것의 메소드를 아는 것은 Python에서 비동기 프로그래밍을 이해하고 수행하는 데 아주 중요합니다. 그래서 문서를 꼼꼼히 읽어보시는게 좋을 겁니다.
ProcessPoolExecutor
완벽하게 작동합니다! 물론 CPU 집약적인 작업을 위해 ProcessPoolExecutor를 사용하는게 좋습니다. ThreadPoolExecutor는 네트워크 작업 또는 I / O에 더 적합합니다. (역주: 파이썬의 GIL 때문에)
API는 비슷하지만 ProcessPoolExecutor는 다중 처리 모듈을 사용하며 Global Interpreter Lock의 영향을 받지 않습니다. 그러나 picklable이 아닌 객체는 사용할 수 없습니다. 따라서 우리는 process pool executor에 전달 된 callable 내부에서 무엇을 사용하고 리턴하는지 대해서 신중하게 선택할 필요가 있습니다.
Executor.map()
두 executors 는 일반적인 방법인 map ()을 사용합니다. 내장 함수와 마찬가지로 map 메서드는 제공된 함수에 대한 여러 호출을 허용하여 iterable의 각 항목을 해당 함수에 전달합니다. 이 경우를 제외하고는 함수가 동시에 호출됩니다. 다중 처리의 경우,이 반복 가능은 청크로 분리되고 이러한 청크는 각각 별도의 프로세스에서 함수로 전달됩니다. chunk_size 매개 변수를 전달하여 청크 크기를 제어 할 수 있습니다. 기본적으로 청크 크기는 1입니다.
다음은 공식 문서의 ThreadPoolExample입니다.
그리고 ProcessPoolExecutor 예제 :
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 | import concurrent.futures import math PRIMES = [ 112272535095293, 112582705942171, 112272535095293, 115280095190773, 115797848077099, 1099726899285419] def is_prime(n): if n % 2 == 0: return False sqrt_n = int(math.floor(math.sqrt(n))) for i in range(3, sqrt_n + 1, 2): if n % i == 0: return False return True def main(): with concurrent.futures.ProcessPoolExecutor() as executor: for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)): print('%d is prime: %s' % (number, prime)) if __name__ == '__main__': main() |
as_completed() & wait()
wait () 함수는 두 세트를 포함하는 명명된 튜플을 반환합니다. 하나의 세트에는 완료된 futures (결과 또는 예외가 있음)과 완료되지 않은 것을 포함하는 다른 세트가 포함됩니다.
번역:
http://masnun.com/2016/03/29/python-a-quick-introduction-to-the-concurrent-futures-module.html
'Python' 카테고리의 다른 글
파이썬과 동시성에 대한 정리 (0) | 2017.05.01 |
---|---|
파이썬 동시성 프로그래밍 - (9) 제네레이터 & 코루틴 & asyncio & async/await (2) | 2017.04.30 |
파이썬 동시성 프로그래밍 - (7) GPGPU (pyCuda) (2) | 2017.04.27 |
파이썬 동시성 프로그래밍 - (6) 분산 (celery) (0) | 2017.04.27 |
파이썬 동시성 프로그래밍 - (5) 비동기 (gevent) (0) | 2017.04.27 |