concurrent.futures
모듈은 파이썬에서 사용되는 스레딩과 멀티프로세싱을 고도화한 모듈입니다. 이 모듈은 스레드나 프로세스를 비동기 논블록으로 구현할 수 있도록 다양한 API들을 제공하고 있습니다. 먼저 concurrent.futures
모듈의 구성요소이자 개념인 Future
, Excutor
, Module functions
을 알아보겠습니다.
Future
는 호출 가능한 객체를 비동기로 실행하거나, 상태를 조회할 수 있도록 캡슐화합니다. Excutor
클래스의 submit()
메소드의 인자로 함수를 전달하면 Future
객체를 반환합니다. 이러한 Future
객체는 실행의 결과나 현재 상태를 조회할 수 있는 API를 제공하고 있습니다.
상태 확인 API : cancelled(), running(), done() -> bool
Future
객체의 상태를 확인하는 메소드들로, 반환값으로 boolean
타입을 반환합니다.
- cancelled() : 인자로 전달된 함수의 동작이 정상적으로 취소될 경우
True
를 반환합니다.- running() : 함수가 현재 동작중이고, 취소할 수 없는 경우
True
를 반환합니다.- done() : 함수가 성공적으로 동작을 완료되었거나 취소된 경우
True
를 반환합니다.
명령 API : cancel(), result(), exception(), add_done_callback(fn)
Future
객체에 특정 동작을 명령하는 메소드들입니다.
- cancel() : 함수의 동작 취소를 시도하는 메소드입니다. 함수가
실행중/실행종료/취소불가
의 상태인 경우False
를 반환합니다.- result(timeout=None) : 함수의 동작 결과를 반환하는 메소드입니다. 만약 인자로 주어진
timeout
내에 함수의 결과가 반환되지 않는다면TimeoutError
를 발생하고, 함수가 동작을 완료하기 전에 취소된다면CancelledError
를 발생시킵니다.- exception(timeout=None) : 함수 내부에서 예외가 발생하였을때, 만약 인자로 주어진
timeout
내에 함수의 결과가 반환되지 않는다면TimeoutError
를 발생하고, 함수가 동작을 완료하기 전에 취소된다면CancelledError
를 발생시킵니다.- add_done_callback(fn) : 호출 가능한
fn
객체를 콜백함수로 추가합니다.fn
은Future
객체가 취소되거나 실행이 종료될 때 호출됩니다. 추가된 콜백 함수들은 추가된 순서대로 호출됩니다.
Excutor
는 함수나 코루틴과 같은 호출 가능한 객체를 비동기적으로 실행할 수 있도록 메소드를 제공하는 추상 클래스입니다. 직접 사용이 불가능하여 하위 클래스를 통해 구현해야합니다. 대표적으로 ThreadPoolExcutor
와 ProcessPoolExcutor
가 있습니다.
submit(fn, /, *args, **kwargs) -> Future
submit()
메소드는callable
객체와 호출할때 사용할 인자를 매개변수로 받아Future
객체로 반환합니다.
map(func, *iterables, timeout=None, chunksize=1)
파이썬 내장 함수인map
과 유사한 기능을 합니다.
shutdown(wait=True, *, cancel_futures=False)
shutdown()
메소드는 종료 시그널을 보내 실행 중이거나 실행 대기중인Future
객체를 종료시키고 사용 중인 리소스를 정리하는 메소드입니다.shutdown()
이 호출된Excutor
객체는submit()
이나map()
메소드를 사용할 수 없습니다.
wait
이True
인 경우,Future
객체가 실행을 마치고 자원이 해제될 때까지 메소드는 반환하지 않습니다. 반대로wait
이False
인 경우에는 즉시 반환을 하며,Excutor
와 관련된 자원은Future
객체가 실행을 마칠 때 해제됩니다.wait
값과는 관계없이 모든Future
가 실행을 마칠 때까지 프로그램이 종료되지 않습니다.
cancel_futures
가True
인 경우, 실행되지 않은Future
객체의 실행을 취소합니다.
futures
모듈은 2개의 메소드를 제공합니다.
concurrent.futures.wait(fs, timeout=None, return_when=ALL_COMPLETED)
fs
로 주어진Future
객체가 완료될 때까지 기다립니다. 반환값으로는 2개의 튜플로 이루어진set
들을 반환합니다. 실행이 완료되거나 취소된Future
객체들은done
이름의 첫번째set
, 실행이 완료되지 않은Future
객체들은not_done
이름의 두번째set
에 반환됩니다.
timeout
을 통해 반환하기 전 최대 대기 시간을 설정할 수 있습니다. 지정되지 않은 경우에는 대기 시간에 제한이 없습니다.
return_when
은wait()
메소드가 언제 반환되어야 하는지를 설정합니다.
concurrent.futures.as_completed(fs, timeout=None)
as_completed()
메소드는 비동기로 실행중인Future
객체들을 인자로 받아 하나씩 순회하며 완료되기를 기다리는 메소드입니다.fs
로 주어진Future
객체들의Iterator
를 반환하며, 만약timeout
동안 완료되지 않은Future
객체가 __next__()를 통해 호출된다면TimeoutError
를 발생하게 됩니다.
마찬가지로timeout
이 설정되지 않으면 모든Future
객체가 작업이 완료될 때까지 기다리게 됩니다.
- FIRST_COMPLETED :
Future
객체 중 하나라도 동작을 완료하거나 취소될 때 함수가 반환됩니다.- FIRST_EXCEPTION :
Future
객체 중 하나가 예외를 발생시켜 완료되면 함수가 반환됩니다. 만약 예외를 발생시키지 않으면ALL_COMPLETED
와 같습니다.- ALL_COMPLETED : 모든
Future
객체가 동작을 완료하거나 취소되면 함수가 반환됩니다.
https://docs.python.org/ko/3/library/concurrent.futures.html