4

mock.patchPython の( unittest.mock.patchPy3 の) コンテキスト マネージャーがグローバル状態を変更するかどうか、つまり、スレッド セーフかどうかを判断しようとしています。

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

ソースコードを参照しましたが、見ただけでははっきりとはわかりませんでした。

4

2 に答える 2

10

mock.patch本質的にスレッドセーフではないか、スレッドセーフではありません。オブジェクトを変更します。それは実際には、最初に割り当てステートメントがあり、最後に元に戻す割り当てステートメントにすぎません。

パッチが適用されるオブジェクトが複数のスレッドによってアクセスされる場合、すべてのスレッドが変更を認識します。通常、グローバル状態であるモジュールの属性を変更するために使用されます。このように使用すると、スレッドセーフではなくなります。

于 2014-11-12T01:07:51.210 に答える