我有一个单线程的Python3程序,现在想将其转换为多线程。我有一个类似树形结构的数据结构需要读取和写入,可能会有多个线程同时读取和写入。
一种显而易见的方法是为整个数据结构设置一个锁:当正在进行写操作时,没有人可以读取,最多只能同时进行一次写操作,并且在有待处理的读操作时不能进行写操作。
但是,为了提高性能,我希望将锁定更加细粒度化。这是一个完整的16叉树,当完全填充时,有大约5到6百万个叶子节点(在实践中大多数都是平衡的,但不保证)。如果我想要最细粒度的锁定,我可以锁定叶子节点的父节点。这意味着需要超过100,000个锁。
我必须承认,我还没有尝试过。但是我想先问一下:是否有任何硬件限制或性能原因应该阻止我创建这么多锁对象?也就是说,我应该只考虑从根节点向下锁定到第2层(256个锁)吗?
谢谢您的任何见解。
编辑:
更多细节:
我还不知道有多少个核心,因为我们仍在试验,看看我们需要多少计算能力,但我猜只会使用几个核心。
我打算使用大约50,000个线程。有异步I / O和一个套接字每个线程。在代码的引导阶段,尽可能多的线程将同时运行(由硬件限制),但这是一次性的成本。我们更感兴趣的是一旦事情开始运行。那时,我猜每秒只有几千个线程正在运行。我需要测量响应时间,但我猜唤醒周期大约为10ms。这是一次有几十个线程同时活动(平均值)。
现在我写出来了,也许这就是我的问题的答案。如果我一次只需要几十个线程读取或写入,那么我实际上不需要在树上进行如此细粒度的锁定。
一种显而易见的方法是为整个数据结构设置一个锁:当正在进行写操作时,没有人可以读取,最多只能同时进行一次写操作,并且在有待处理的读操作时不能进行写操作。
但是,为了提高性能,我希望将锁定更加细粒度化。这是一个完整的16叉树,当完全填充时,有大约5到6百万个叶子节点(在实践中大多数都是平衡的,但不保证)。如果我想要最细粒度的锁定,我可以锁定叶子节点的父节点。这意味着需要超过100,000个锁。
我必须承认,我还没有尝试过。但是我想先问一下:是否有任何硬件限制或性能原因应该阻止我创建这么多锁对象?也就是说,我应该只考虑从根节点向下锁定到第2层(256个锁)吗?
谢谢您的任何见解。
编辑:
更多细节:
我还不知道有多少个核心,因为我们仍在试验,看看我们需要多少计算能力,但我猜只会使用几个核心。
我打算使用大约50,000个线程。有异步I / O和一个套接字每个线程。在代码的引导阶段,尽可能多的线程将同时运行(由硬件限制),但这是一次性的成本。我们更感兴趣的是一旦事情开始运行。那时,我猜每秒只有几千个线程正在运行。我需要测量响应时间,但我猜唤醒周期大约为10ms。这是一次有几十个线程同时活动(平均值)。
现在我写出来了,也许这就是我的问题的答案。如果我一次只需要几十个线程读取或写入,那么我实际上不需要在树上进行如此细粒度的锁定。
sys.maxsize
锁时收到了有关内存的警告)。 - Tadhg McDonald-Jensen