python - 用鼻子测试python多处理池代码

我试着用nose来编写测试
使用多重处理计算。
我有这个目录结构:

code/
    tests/
        tests.py

tests.py如下所示:
import multiprocessing as mp


def f(i):
    return i ** 2


pool = mp.Pool()
out = pool.map(f, range(10))


def test_pool():
    """Really simple test that relies on the output of pool.map.
    The actual tests are much more complicated, but this is all
    that is needed to produce the problem."""
    ref_out = map(f, range(10))
    assert out == ref_out

if __name__ == '__main__':
    test_pool()

code目录运行,python tests/tests.py通过。
nosetests tests/tests.py无法完成。它会启动,但永远无法接通pool.map的呼叫,只会挂断。
为什么这是最简单的解决方案?

最佳答案

这个问题与pool.map在“全局级别”调用有关。通常您希望避免这种情况,因为即使您的文件是简单导入的,也会执行这些语句。
鼻子必须“import your module”才能找到你的测试,然后执行它们,因此我相信当导入机制开始时,问题就发生了(我没有花时间试图找出这个行为的确切原因)。
你应该把你的初始化代码移到测试夹具上,鼻子用“AA>装饰器”来支撑固定装置。有一种可能性(可能是保持with_setuppool为全局变量时最简单的变化):

import multiprocessing as mp
from nose import with_setup

pool = None
out  = None

def f(i):
    return i ** 2

def setup_func():
    global pool
    global out
    pool = mp.Pool()
    out  = pool.map(f, range(10))

@with_setup(setup_func)
def test_pool():
    """Really simple test that relies on the output of pool.map.
    The actual tests are much more complicated, but this is all
    that is needed to produce the problem."""
    global out
    ref_out = map(f, range(10))
    assert out == ref_out

if __name__ == '__main__':
    test_pool()

执行:
$ nosetests tests/tests.py
.
----------------------------------------------------------------------
Ran 1 test in 0.011s

OK

本文翻译自 https://stackoverflow.com/questions/18640334/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 python testing multiprocessing python-nose


相关文章:

python - lxml库在添加新元素后不向树添加换行符或缩进

python - 在更改基于虚拟环境的Jupyter笔记本内核之后,对其进行更新

python - 传递给wchar **的对c dll的python调用

python - 模拟上下文中的计时,以使用具有auto_now_add = True的字段DateTimeField创建模型

python - 主循环旁的多处理

python - Python-阶乘之和[关闭]

javascript - 如何将硒用于桌面应用程序?

java - 是否有适用于Java的虚假文件系统框架?

linux - 为什么Linux不使用光纤代替抢占式多任务处理?

python - 为什么numpy计算不受全局解释器锁的影响?