[Python]concurrent.futures 모듈

Jay·2023년 2월 7일
0
post-thumbnail

concurrent.futures

concurrent.futures 모듈은 파이썬에서 사용되는 스레딩과 멀티프로세싱을 고도화한 모듈입니다. 이 모듈은 스레드나 프로세스를 비동기 논블록으로 구현할 수 있도록 다양한 API들을 제공하고 있습니다. 먼저 concurrent.futures 모듈의 구성요소이자 개념인 Future, Excutor, Module functions을 알아보겠습니다.


Future

Future는 호출 가능한 객체를 비동기로 실행하거나, 상태를 조회할 수 있도록 캡슐화합니다. Excutor 클래스의 submit() 메소드의 인자로 함수를 전달하면 Future 객체를 반환합니다. 이러한 Future 객체는 실행의 결과나 현재 상태를 조회할 수 있는 API를 제공하고 있습니다.

APIs

상태 확인 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 객체를 콜백함수로 추가합니다. fnFuture 객체가 취소되거나 실행이 종료될 때 호출됩니다. 추가된 콜백 함수들은 추가된 순서대로 호출됩니다.

Excutor

Excutor는 함수나 코루틴과 같은 호출 가능한 객체를 비동기적으로 실행할 수 있도록 메소드를 제공하는 추상 클래스입니다. 직접 사용이 불가능하여 하위 클래스를 통해 구현해야합니다. 대표적으로 ThreadPoolExcutorProcessPoolExcutor가 있습니다.

APIs

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() 메소드를 사용할 수 없습니다.
waitTrue인 경우, Future 객체가 실행을 마치고 자원이 해제될 때까지 메소드는 반환하지 않습니다. 반대로 waitFalse인 경우에는 즉시 반환을 하며, Excutor와 관련된 자원은 Future 객체가 실행을 마칠 때 해제됩니다. wait 값과는 관계없이 모든 Future가 실행을 마칠 때까지 프로그램이 종료되지 않습니다.
cancel_futuresTrue인 경우, 실행되지 않은 Future 객체의 실행을 취소합니다.


Module functions

futures 모듈은 2개의 메소드를 제공합니다.

APIs

concurrent.futures.wait(fs, timeout=None, return_when=ALL_COMPLETED)
fs로 주어진 Future 객체가 완료될 때까지 기다립니다. 반환값으로는 2개의 튜플로 이루어진 set들을 반환합니다. 실행이 완료되거나 취소된 Future 객체들은 done 이름의 첫번째 set, 실행이 완료되지 않은 Future 객체들은 not_done 이름의 두번째 set에 반환됩니다.
timeout을 통해 반환하기 전 최대 대기 시간을 설정할 수 있습니다. 지정되지 않은 경우에는 대기 시간에 제한이 없습니다.
return_whenwait()메소드가 언제 반환되어야 하는지를 설정합니다.

concurrent.futures.as_completed(fs, timeout=None)
as_completed() 메소드는 비동기로 실행중인 Future 객체들을 인자로 받아 하나씩 순회하며 완료되기를 기다리는 메소드입니다. fs로 주어진 Future 객체들의 Iterator를 반환하며, 만약 timeout 동안 완료되지 않은 Future 객체가 __next__()를 통해 호출된다면 TimeoutError를 발생하게 됩니다.
마찬가지로 timeout이 설정되지 않으면 모든 Future 객체가 작업이 완료될 때까지 기다리게 됩니다.

return when - Constants

  • FIRST_COMPLETED : Future 객체 중 하나라도 동작을 완료하거나 취소될 때 함수가 반환됩니다.
  • FIRST_EXCEPTION : Future 객체 중 하나가 예외를 발생시켜 완료되면 함수가 반환됩니다. 만약 예외를 발생시키지 않으면 ALL_COMPLETED와 같습니다.
  • ALL_COMPLETED : 모든 Future 객체가 동작을 완료하거나 취소되면 함수가 반환됩니다.






reference

https://docs.python.org/ko/3/library/concurrent.futures.html

0개의 댓글