Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python';s`unittest.mock.patch`mutate全局状态?_Python_Multithreading_Python Mock_Global State - Fatal编程技术网

python';s`unittest.mock.patch`mutate全局状态?

python';s`unittest.mock.patch`mutate全局状态?,python,multithreading,python-mock,global-state,Python,Multithreading,Python Mock,Global State,我试图确定Python的mock.patch(unittest.mock.patch在Py3中)上下文管理器是否会改变全局状态,也就是说,它是否是线程安全的 例如:假设一个线程使用上下文管理器在函数foo中修补函数bar,然后在上下文管理器中,解释器暂停该线程(因为GIL等),并恢复另一个线程,该线程在所述上下文管理器之外运行foo。如果patch是线程安全的,我希望函数foo和bar的全局状态不会被修改,因此第二个线程将获得foo的正常行为。但是如果patch修改全局状态,第二个线程将获得fo

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

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


我参考了源代码,但仅仅通过查看它无法清楚地分辨出来。

我继续使用Python 3.4上的
multiprocessing.dummy.Pool
运行了一个粗略的实验。实验使用线程池将一个函数映射到范围(100)输入,如果该函数的输入正好是10,则它将一个内部函数修补为调用time.sleep()。如果补丁是线程安全的,那么结果将立即显示,但10的结果会延迟显示;如果它不是线程安全的,那么一些结果将立即显示,而其他许多结果将延迟显示


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

mock.patch
本身不是线程安全的,也不是线程安全的。它修改一个对象。它实际上只不过是开始时的赋值语句,然后是结束时的撤消赋值语句

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