我正在做ddbmock 项目。基本上,这是一个复制 Amazon DynamoDB API 的服务器。
尽管此实现不直接涉及线程,但它很可能在多线程环境中运行,并且目前,我知道它具有不可预测的“特性”:) 所有线程都将在同一个存储中工作......
第一步是添加互斥体,但我如何测试我没有遗漏任何东西并且设计确实有效?有什么可靠的方法吗?
我正在做ddbmock 项目。基本上,这是一个复制 Amazon DynamoDB API 的服务器。
尽管此实现不直接涉及线程,但它很可能在多线程环境中运行,并且目前,我知道它具有不可预测的“特性”:) 所有线程都将在同一个存储中工作......
第一步是添加互斥体,但我如何测试我没有遗漏任何东西并且设计确实有效?有什么可靠的方法吗?
观看此视频,您将意识到在 CPython 中无法可靠地执行您想要的操作。这仅仅是因为 python 将一切都交给了操作系统。它不以任何方式(主动)控制调度,它只是释放 GIL,有时让操作系统在需要时进行上下文切换。这对多核计算机产生了一些丑陋的后果。
无论如何,在其他语言中,这也是很难做到的。调试并发程序是一个地狱,这就是为什么你应该尽可能避免它(如果你想进行可靠的测试)。
@martineau,问题不仅限于CPython。任何时候有共享资源都可能导致并发问题。
一种方法是完全避免它。序列化所有内容,不允许并发。鉴于这是一个内存模拟服务器,这可能是一个合理的限制。
但是,如果您确实想提供并行访问,我会使用的策略是长时间使用各种请求对系统进行压力测试。这往往会摆脱大量的竞争条件错误。否则我知道没有可靠的方法来证明程序没有并发错误。