加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python程序可以创建的锁的数量是否有任何限制?

发布时间:2020-12-16 22:50:28 所属栏目:Python 来源:网络整理
导读:我有一个单线程python3程序,我试图转换为使用许多线程.我有一个类似于树的数据结构,可以读取和写入.可能有许多线程需要同时读写. 一个显而易见的方法是对整个数据结构使用单个锁:在写入发生时没有人可以读取,一次只能发生一次写入,并且在有待处理的读取时不

我有一个单线程python3程序,我试图转换为使用许多线程.我有一个类似于树的数据结构,可以读取和写入.可能有许多线程需要同时读写.

一个显而易见的方法是对整个数据结构使用单个锁:在写入发生时没有人可以读取,一次只能发生一次写入,并且在有待处理的读取时不会发生写入.

但是,我想让锁定更精细,以获得更好的性能.它是一棵完整的16棵树,当人口密集时,它有大约5到6百万片叶子(实际上大多数都是平衡的,但不能保证).如果我想要最细粒度的锁定,我可以锁定叶子的父母.这意味着超过10万把锁.

我必须承认,我还没有尝试过.但我想我先问:是否存在任何硬件限制或性能原因导致我无法创建如此多的锁定对象?也就是说,我是否应该考虑从根(例如256锁)锁定到深度2?

感谢您的任何见解.

编辑:

更多细节:

我还不知道有多少核心,因为我们仍在试验我们需要多少计算能力,但我猜测只会使用少数几个核心.

我的目标是大约50,000个线程.有异步I / O,每个插槽一个线程.在代码的引导阶段,尽可能多的线程将同时运行(受硬件限制),但这是一次性成本.我们更感兴趣的是一旦事情开始运行.那时,我猜测每秒只有几千个正在运行.我需要测量响应时间,但我猜它每个唤醒周期大约10ms.这是一次活动的几十个线程(平均而言).

现在我写出来了,也许这就是我的问题的答案.如果我一次只需要几十个线程读取或写入,那么我真的不需要在树上进行细粒度锁定.

最佳答案
过早优化

这是过早优化的典型例子.在不知道线程花费多少时间阻塞的情况下,可能等待其他写入发生,不清楚从创建管理数千个锁的额外复杂性中你必须获得什么.

全球口译员锁

线程本身可能是一个不成熟的优化.你的任务是否易于线程化?许多线程可以安全地并行工作吗?需要大量共享状态(即许多频繁锁定)的任务通常是高线程计数的不良候选者.在python中,由于GIL,你可能会看到更少的好处.您的线程是否正在执行大量IO,或者调用外部应用程序,或者使用用C编写的python模块来正确释放GIL?如果没有,线程可能实际上不会给你带来任何好处.您可以使用多处理模块来回避GIL,但是跨越流程边界传递锁定和写入会产生开销,具有讽刺意味的是,它可能会使您的应用程序变得更慢

队列

另一种选择是使用写队列.如果线程实际上不需要共享状态,但它们都需要写入同一个对象(即从该对象读取的次数很少),您可以简单地将写入添加到队列中并让一个线程处理写入,不需要任何锁.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读