메인 콘텐츠로 건너뛰기

API 개요


원문

class ContextAwareThread

호출하는 쪽의 컨텍스트를 그대로 가져와 함수를 실행하는 Thread입니다. 이는 threading.Thread를 그대로 대체할 수 있는 구현으로, 스레드 내부에서도 호출이 예상대로 동작하도록 보장합니다. Weave는 특정 contextvars가 설정되어 있어야 합니다(call_context.py 참조). 그러나 새 스레드는 기본적으로 부모의 컨텍스트를 복사하지 않기 때문에, 호출 컨텍스트가 손실될 수 있으며 이는 바람직하지 않습니다. 이 클래스는 contextvars 복사를 자동으로 처리하여, 사용자가 기대하는 대로 이 스레드를 사용하기만 하면 “그냥 잘 동작”하도록 합니다. 이 클래스를 사용하지 않고도, 대신 다음과 같이 작성하여 동일한 효과를 얻을 수 있습니다:
def run_with_context(func, *args, **kwargs):
     context = copy_context()
     def wrapper():
         context.run(func, *args, **kwargs)
     return wrapper

thread = threading.Thread(target=run_with_context(your_func, *args, **kwargs))
thread.start()
원문

메서드 __init__

__init__(*args: 'Any', **kwargs: 'Any') → None

property daemon

이 스레드가 데몬 스레드인지 여부를 나타내는 불리언 값입니다. 이 속성은 start()가 호출되기 전에 설정해야 하며, 그렇지 않으면 RuntimeError가 발생합니다. 초기값은 생성한 스레드로부터 상속됩니다. 메인 스레드는 데몬 스레드가 아니므로, 메인 스레드에서 생성된 모든 스레드는 기본적으로 daemon = False입니다. 데몬 스레드만 남았을 때 전체 Python 프로그램이 종료됩니다.

property ident

이 스레드의 스레드 식별자이며, 스레드가 시작되지 않았다면 None입니다. 0이 아닌 정수입니다. get_ident() 함수를 참조하세요. 스레드가 종료되고 다른 스레드가 생성될 때 스레드 식별자는 재사용될 수 있습니다. 스레드가 종료된 이후에도 이 식별자는 여전히 사용할 수 있습니다.

property name

식별 목적으로만 사용되는 문자열입니다. 별도의 의미는 없습니다. 여러 스레드에 동일한 name을 지정할 수 있습니다. 초기 name은 생성자에서 설정됩니다.

property native_id

이 스레드의 네이티브 정수형 스레드 ID이며, 스레드가 시작되지 않았다면 None입니다. 이 값은 음이 아닌 정수입니다. get_native_id() 함수를 참조하세요. 이는 커널이 보고하는 스레드 ID를 나타냅니다.
원문

메서드 run

run() → None

원문

class ContextAwareThreadPoolExecutor

호출자의 컨텍스트에서 함수를 실행하는 ThreadPoolExecutor입니다. 이 클래스는 concurrent.futures.ThreadPoolExecutor를 그대로 대체하는(drop-in replacement) 구현으로, executor 내부에서도 Weave 호출이 예상대로 동작하도록 보장합니다. Weave는 특정 contextvars가 설정되어 있어야 하는데(call_context.py 참고), 새 스레드는 부모 스레드의 컨텍스트를 자동으로 복사하지 않기 때문에 호출 컨텍스트가 손실될 수 있습니다. 이는 바람직하지 않습니다. 이 클래스는 contextvar 복사를 자동화하여, 사용자가 기대하는 대로 이 executor를 사용하면 “그냥 동작”하도록 해 줍니다. 이 클래스를 사용하지 않고도, 대신 다음과 같이 작성하면 동일한 효과를 얻을 수 있습니다:
with concurrent.futures.ThreadPoolExecutor() as executor:
     contexts = [copy_context() for _ in range(len(vals))]

     def _wrapped_fn(*args):
         return contexts.pop().run(fn, *args)

     executor.map(_wrapped_fn, vals)
원문

메서드 __init__

__init__(*args: 'Any', **kwargs: 'Any') → None

원문

method map

map(
    fn: 'Callable',
    *iterables: 'Iterable[Any]',
    timeout: 'float | None' = None,
    chunksize: 'int' = 1
) → Iterator

원문

method submit

submit(fn: 'Callable', *args: 'Any', **kwargs: 'Any') → Any

원문

function deprecated

deprecated(new_name: 'str') → Callable[[Callable[, Any]], Callable[, Any]]
함수를 사용 중단(deprecated) 대상으로 표시하고, 사용자에게 new_name을 사용하도록 안내하는 데코레이터입니다.
원문

함수 is_colab

is_colab()

원문

function is_notebook

is_notebook() → bool

원문

함수 log_once

log_once(log_method: 'Callable[[str], None]', message: 'str') → None
동일한 유형의 이후 메시지는 출력하지 않고, 메시지를 한 번만 기록합니다. 이는 로그가 과도하게 쌓이지 않도록 하면서 오류를 사용자에게 알릴 때 유용합니다. 이 기능은 동일한 오류 메시지가 여러 번 발생할 수 있는 경우에 특히 유용합니다. 예를 들어, 어떤 op의 저장이 실패하면 해당 op가 호출될 때마다 같은 문제가 발생할 가능성이 큽니다. 또는 패치된 이터레이터에서 오류가 발생한다면, 결과를 순회할 때마다 동일한 오류가 발생할 수 있습니다. 이 기능을 사용하면, 로그를 불필요하게 채우지 않고도 사용자에게 오류를 알릴 수 있습니다. 인수(Args):
  • log_method: 메시지를 기록하는 데 사용할 메서드입니다. 문자열 인수를 하나 받아야 합니다.
  • message: 기록할 메시지입니다. 예시(Example):
log_once(logger.error, "Failed to save op")