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文件,然后从该文件读回),我将跟踪队列中应包含的项目数(以检测错误的阻塞操作),我将改变读者和作者的数量。一旦我可以让这个脚本运行一段时间而不发生任何崩溃,我将非常有信心我的队列是好的

  • 到目前为止,我用这种方法验证的队列在生产中已经坚如磐石。

    你能生成随机测试数据吗?我可以,尽管我不相信队列中输入或输出的数据的类型和大小会有任何区别?肯定有什么可以测试的吗?或者你认为这会有所不同吗?我放了一些代码,可以用来生成测试数据。谢谢,很高兴知道我的思路是正确的。到目前为止,我编写的脚本运行良好。我将试着在他们身上做更多的工作,把事情混合起来,看看我是否能找到问题所在