gpt4 book ai didi

python - mock.call_count 的线程安全版本

转载 作者:太空狗 更新时间:2023-10-29 21:54:28 25 4
gpt4 key购买 nike

看起来 Mock.call_count不能与线程一起正常工作。例如:

import threading
import time
from mock import MagicMock


def f():
time.sleep(0.1)

def test_1():
mock = MagicMock(side_effect=f)
nb_threads = 100000
threads = []
for _ in range(nb_threads):
thread = threading.Thread(target=mock)
threads.append(thread)
thread.start()

for thread in threads:
thread.join()

assert mock.call_count == nb_threads, mock.call_count

test_1()

此代码产生以下输出:

Traceback (most recent call last):
File "test1.py", line 24, in <module>
test_1()
File "test1.py", line 21, in test_1
assert mock.call_count == nb_threads, mock.call_count
AssertionError: 99994

有没有一种方法可以在代码的多线程部分中使用 call_count(或类似的)?我想避免自己重写 MagicMock...

最佳答案

我最终通过使用一个链接到副作用方法的计数器和一个锁让它工作。

import threading
import time
from mock import MagicMock

lock_side_effect = threading.Lock()

def f():
with lock_side_effect:
f.call_count += 1
time.sleep(0.1)

f.call_count = 0

def test_1():
mock = MagicMock(side_effect=f)
nb_threads = 100000
threads = []
for _ in range(nb_threads):
thread = threading.Thread(target=mock)
threads.append(thread)
thread.start()

for thread in threads:
thread.join()

assert f.call_count == nb_threads, f.call_count

test_1()

因此,我正在计算 f 而不是 mock 的调用次数,但结果符合预期。

关于python - mock.call_count 的线程安全版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39332139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com