mock.patch
Python の( unittest.mock.patch
Py3 の) コンテキスト マネージャーがグローバル状態を変更するかどうか、つまり、スレッド セーフかどうかを判断しようとしています。
例: 1 つのスレッドがコンテキスト マネージャーを使用して関数bar
内の関数にパッチを適用foo
し、コンテキスト マネージャー内でインタープリターがそのスレッドを一時停止し (GIL などの理由で)、そのfoo
コンテキスト マネージャーの外部で実行される別のスレッドを再開するとします。がスレッドセーフである場合、関数およびpatch
のグローバル状態は変更されていないことが期待されるため、2 番目のスレッドは の通常の動作を取得します。しかし、グローバル状態を変更すると、2 番目のスレッドは、コンテキスト マネージャー内になくても、変更された動作を取得します。foo
bar
foo
patch
foo
ソースコードを参照しましたが、見ただけでははっきりとはわかりませんでした。