Python 如何调试此缓冲文件队列?
我有一个队列对象,它在我的项目中起着相当重要的作用,我不能让它有任何错误 它的思想是类似于内置的Python 如何调试此缓冲文件队列?,python,debugging,testing,queue,Python,Debugging,Testing,Queue,我有一个队列对象,它在我的项目中起着相当重要的作用,我不能让它有任何错误 它的思想是类似于内置的队列,它的基类,但它将数据或数据的一部分存储在一个文件中以保留内存。我决定把其中的一部分留在记忆中,因为这样会加快速度。我已经把代码放好了,看它可能比解释它更容易 想做这件事似乎很奇怪,但我需要排队做很多工作,排队的速度比我能完成的快得多,如果我使用标准的队列,它会占用太多内存。我不能只是在队列上设置一个maxsize,阻止工人将东西放入队列,因为我想尽快知道要处理的数据总量。我也不能先算出一个总数,
队列
,它的基类,但它将数据或数据的一部分存储在一个文件中以保留内存。我决定把其中的一部分留在记忆中,因为这样会加快速度。我已经把代码放好了,看它可能比解释它更容易
想做这件事似乎很奇怪,但我需要排队做很多工作,排队的速度比我能完成的快得多,如果我使用标准的队列
,它会占用太多内存。我不能只是在队列上设置一个maxsize,阻止工人将东西放入队列,因为我想尽快知道要处理的数据总量。我也不能先算出一个总数,但不能将其排队,然后通过放入队列返回,因为每次我查看数据时,总数都会不同,最后的总数将不匹配
我的问题是,当缓冲区或文件中仍有项时,或者在调用了complete且队列为空后,如何彻底测试这一点,以确保没有项丢失,或者更重要的是,getter上没有任何阻塞
当您知道某些给定输入的输出应该是什么时,有些事情似乎很容易测试和设置单元测试,但是测试这样的东西我不确定是否有一种有效的方法。有可能用单元测试来测试这种东西吗
我已经建立了一个测试程序,以不同的速度放入和获取不同数量的项目,这似乎很好,但我已经看到了getter阻塞。get
的证据,项目仍然在队列中,因此我相信存在问题
我能彻底测试它以找到任何剩余的bug或者几乎确定它没有bug的最好方法是什么
编辑
我可以生成一些测试数据,类似于我在下面代码中使用的数据,我只在项目中的某些条件下拥有文件的校验和,其他时候它是None
,所以我只是在下面代码中的一些时间生成它来尝试并模拟它
import os
import hashlib
def hash(f_obj):
md5 = hashlib.md5()
while True:
data = f_obj.read(8192)
if not data:
break
md5.update(data)
return md5.hexdigest()
def produce(at_once,total_items):
items=[]
count=0
for dir,folders,files in os.walk("/"):
for f in files:
try:
f_path= os.path.join(dir,f)
f_size= os.path.getsize(f_path)
f_mtime= os.path.getmtime(f_path)
with open(f_path) as file_obj:
f_hash= hash(file_obj) if f_size%2 else None
items.append((f_path,f_size,f_mtime,f_hash))
count+=1
except Exception as err:
print "#####",err,"#####"
if len(items) >= at_once:
yield items
items=[]
if count >= total_items:
break
if items:
yield items
我已经编写了一些类似的组件
我验证其正确性的策略通常有三个方面:
检查代码。在我写完代码一两天后,我将尝试全面地检查代码,特别注意我觉得可能有问题的地方。如果可能的话,我也会请一位同事来复习
单元测试验证它在“明显”情况和边缘情况下表现良好。它们有助于确认不存在愚蠢的错误,并有助于防止未来的倒退……但我一般不希望发现令人惊讶的错误
压力测试脚本。该脚本将生成一组线程,“随机”执行读写操作,确保不会发生任何爆炸。我的第一个版本通常是完全随机的,但随着我的进一步发展,我会给它添加一些智能。我将确保“随机”读/写将偏向于触发复杂的代码路径(例如,在您的示例中,偏向于溢出到gzip文件,然后从该文件读回),我将跟踪队列中应包含的项目数(以检测错误的阻塞操作),我将改变读者和作者的数量。一旦我可以让这个脚本运行一段时间而不发生任何崩溃,我将非常有信心我的队列是好的
到目前为止,我用这种方法验证的队列在生产中已经坚如磐石。你能生成随机测试数据吗?我可以,尽管我不相信队列中输入或输出的数据的类型和大小会有任何区别?肯定有什么可以测试的吗?或者你认为这会有所不同吗?我放了一些代码,可以用来生成测试数据。谢谢,很高兴知道我的思路是正确的。到目前为止,我编写的脚本运行良好。我将试着在他们身上做更多的工作,把事情混合起来,看看我是否能找到问题所在