python的`unittest.mock.patch`是否会改变全局状态?

And*_*ter 2 python multithreading global-state python-mock

我正在尝试确定Python mock.patch(unittest.mock.patch在Py3中)上下文管理器是否会改变全局状态,即它是否是线程安全的.

例如:让我们假设一个线程bar在函数内foo使用上下文管理器修补函数,然后在上下文管理器中,解释器暂停该线程(因为GIL等)并恢复另一个foo在所述上下文管理器之外运行的线程.如果patch是线程安全的我期望的功能的全局状态foobar未修改,所以第二个线程将获得的正常行为foo.但是如果patch修改全局状态,第二个线程将获得修改后的行为,foo即使它不在上下文管理器中.

我提到了源代码,但仅通过查看它就无法清楚地说出来.

Ned*_*der 6

mock.patch本质上不是线程安全的或不是线程安全的.它修改了一个对象.它只不过是一开始的赋值语句,最后是一个撤消赋值语句.

如果被修补的对象被多个线程访问,那么所有线程都将看到更改.通常,它用于修改模块的属性,这些属性是全局状态.以这种方式使用时,它不是线程安全的.


And*_*ter 5

我继续使用multiprocessing.dummy.PoolPython 3.4进行了一个粗略的实验。实验使用线程池将函数映射到 range(100) 输入,如果函数的输入正好是 10,则修补内部函数以调用 time.sleep()。如果补丁是线程安全的,除了 10 的结果会延迟显示外,所有结果都会立即显示;如果它不是线程安全的,一些结果会立即显示,而许多其他结果会延迟显示。

结果表明,unittest.mock.patch 确实会改变全局状态。很高兴知道!