파이썬 컨텍스트 변수란?
컨텍스트 변수(Context Variable)는 실행되는 컨텍스트에 따라 서로 다른 값을 가질 수 있는 변수입니다. 각 실행 스레드마다 변수의 값이 다를 수 있는 스레드 로컬 저장소(Thread-Local Storage)와 달리, 컨텍스트 변수는 하나의 실행 스레드 안에서도 여러 개의 컨텍스트를 가질 수 있습니다. 이러한 특성 덕분에 동시에 실행되는 비동기 작업에서 변수를 추적하고 관리하는 데 매우 유용합니다.
ContextVar 클래스로 컨텍스트 변수 선언하기
컨텍스트 변수는 contextvars 모듈의 ContextVar 클래스를 사용하여 선언하고 다룰 수 있습니다.
import contextvars
name = contextvars.ContextVar("name", default = 'Hello')
default 매개변수는 선택 사항으로, 현재 컨텍스트에서 해당 변수의 값이 발견되지 않을 때 ContextVar.get() 메서드가 반환하는 기본값입니다.
name: 변수의 이름을 나타내며, 읽기 전용(read-only) 속성입니다.
ContextVar 클래스의 주요 메서드
ContextVar 클래스에는 다음과 같은 메서드가 정의되어 있습니다.
| get() | 현재 컨텍스트에서 해당 컨텍스트 변수의 값을 반환합니다. 현재 컨텍스트에 변수의 값이 없는 경우 다음 중 하나가 수행됩니다.
|
| set() | 현재 컨텍스트에서 컨텍스트 변수에 새로운 값을 설정할 때 호출합니다. |
| reset() | 컨텍스트 변수를 토큰(token)을 생성한 ContextVar.set() 호출 이전의 값으로 되돌립니다. |
Context 클래스
contextvars 모듈의 Context 클래스는 컨텍스트 변수와 그 값들을 매핑(mapping)한 객체입니다.
Context(): 아무런 값도 포함하지 않은 빈 컨텍스트를 생성합니다.
현재 실행 중인 컨텍스트의 복사본을 얻으려면 copy_context() 함수를 사용합니다.
run(callable, *args, **kwargs) 메서드는 callable(*args, **kwargs) 코드를 run 메서드가 호출된 컨텍스트 객체 내에서 실행하고, 그 실행 결과를 반환합니다. callable이 컨텍스트 변수에 가한 변경 사항은 모두 해당 컨텍스트 객체 내에만 포함됩니다. 또한 동일한 컨텍스트 객체에 대해 둘 이상의 OS 스레드에서 호출하거나 재귀적으로 호출하면 RuntimeError가 발생합니다.
Context 객체의 주요 메서드
| copy() | 컨텍스트 객체의 얕은 복사본(shallow copy)을 반환합니다. |
| context[var] | var 컨텍스트 변수의 값을 반환합니다. 해당 변수가 컨텍스트 객체에 설정되어 있지 않으면 KeyError가 발생합니다. |
| get() | 컨텍스트 객체에 해당 컨텍스트 변수의 값이 있으면 그 값을 반환하고, 없으면 기본값(default)을 반환합니다. 기본값이 지정되지 않았다면 None을 반환합니다. |
| iter() | 컨텍스트 객체에 저장된 변수들을 순회하는 반복자(iterator)를 반환합니다. |
| len() | 컨텍스트 객체에 설정된 변수의 개수를 반환합니다. |
| keys() | 컨텍스트 객체의 모든 변수 목록을 반환합니다. |
| values() | 컨텍스트 객체의 모든 변수 값 목록을 반환합니다. |
| items() | 컨텍스트 객체의 모든 변수와 그 값들을 담은 2-튜플(2-tuple) 목록을 반환합니다. |