メインコンテンツへスキップ

API 概要


ソースコード

class ContextAwareThread

呼び出し元のコンテキストで関数を実行するスレッド。 これは 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()
ソースコード

method __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 になります。 これは 0 以上の整数です。get_native_id() 関数を参照してください。これはカーネルによって報告される Thread ID を表します。
ソースコード

method run

run() → None

ソースコード

class ContextAwareThreadPoolExecutor

呼び出し元のコンテキストで関数を実行する ThreadPoolExecutor です。 これは concurrent.futures.ThreadPoolExecutor のドロップイン代替実装で、executor の内部でも Weave の呼び出しが期待どおりに動作することを保証します。Weave は特定の contextvars が設定されていることを必要とします(call_context.py を参照)が、新しいスレッドは親からコンテキストを自動的にはコピーしないため、call context が失われてしまうことがあります — これは望ましくありません。このクラスは contextvars のコピーを自動化し、この 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

ソースコード

メソッド 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]]
関数を非推奨としてマークし、ユーザーを new_name にリダイレクトするデコレータ。
ソースコード

function is_colab

is_colab()

ソースコード

function is_notebook

is_notebook() → bool

ソースコード

function log_once

log_once(log_method: 'Callable[[str], None]', message: 'str') → None
同じ種類のメッセージを 1 回だけログに記録し、それ以降の同種メッセージは抑制します。これは、ログをスパム的に大量出力することなくエラーをユーザーに通知したい場合に有用です。 同じエラーメッセージが何度も発生しうるケースで主に役立ちます。たとえば、ある op の保存に失敗した場合、その op が呼び出されるたびに同じ問題が発生する可能性があります。また、パッチを当てたイテレーターにエラーがある場合、その結果を反復処理するたびにエラーが発生する可能性があります。これにより、ログを不要に埋め尽くすことなく、エラーについてユーザーに通知できます。 Args:
  • log_method: メッセージをログに記録するために使用するメソッド。文字列引数を 1 つ受け取る必要があります。
  • message: ログに記録するメッセージ。 Example:
log_once(logger.error, "Failed to save op")