我有一个Python 3应用程序,它使用multiprocessing模块并行地在许多CPU上传播大量资源密集型科学计算。计算中有几个步骤需要进程分配适度大的数组。当我在OS X笔记本电脑上运行应用程序时,该应用程序运行正常,但是,长期计划是它通常从docker容器内部运行,而docker容器将在Amazon Web Services EC2实例或其他实例上运行可比较的基于云的虚拟机 - 有效地将应用程序嵌套在两个级别的机器虚拟化技术中。
我预计将来,其他一些用户可能会尝试运行应用程序,并将虚拟机资源(内存,交换空间等)配置为已设置得过于小的值。 (有明确的财务激励措施,因为您倾向于为云计算服务支付更少的费用,您使用的资源越少。)
在严格限制的资源场景下,这可能会导致其中一个进程在暂时无法获得足够大的内存块时尝试为阵列分配内存,从而触发Python {{ 1}}例外。
此问题的解决方案可能类似于下面的代码段:尝试分配内存,如果发生则捕获异常,然后等待一段时间再试一次:
MemoryError
我的问题:如何构建单元测试以验证等待行为?或者甚至可能吗?看起来我必须编写一个测试,通过首先占用我系统上的大部分内存资源来设置自己,然后在import numpy as np
import time
import datetime
import os
from warnings import warn
def getHugeArray(n, retry=1, warnuser=5):
# Don't retry too often
if retry < 0.1:
retry = 1
# Don't send a useless flood of warning messages
if warnuser < retry:
warnuser = retry
success, outarray = False, None
startwait, lastcount = datetime.datetime.now(), 0
# Keep re-asking the OS for memory allocation until the OS gives it to us
while success is False:
try:
outarray = np.zeros(n)
success = True
except MemoryError:
time.sleep(retry)
wait = (datetime.datetime.now()-startwait).total_seconds()
newcount = int(wait/warnuser)
if newcount > lastcount:
msg = 'PID {0}: waiting for memory allocation for {1} seconds'
warn(msg.format(os.getpid(), wait))
lastcount = newcount
return outarray
函数开始执行时等待一段时间,然后释放资源以便getHugeArray()
可以抓取它们,并最终检查getHugeArray()
函数是否返回正确的返回值。
这是在集成测试框架中尝试做的更好,而不是作为单元测试吗?或者在任何情况下,在这种情况下我可以使用什么样的工具或测试框架来测试我的代码,我应该如何设置它?