multithreading - 是否有任何理由锁定队列?
问题描述
我只是想知道是否有任何理由我可能想要锁定队列。我正在开发一个应用程序,该应用程序具有多个读取和写入数据库的线程。为了减少流量,我想在任何给定点减少对该数据库的调用量(我知道许多数据库已经可以处理一些流量)。为读/写请求创建一个队列并且只执行顶部的请求然后用锁保护队列的推送和弹出命令是否有意义?对每个读/写调用进行锁定是否足够?无论如何,锁不是由操作系统实现为“队列”吗?这个“队列”的大小可能是一个问题,还是有任何其他原因我不会单独使用锁?谢谢!
解决方案
您可以限制参与数据库请求的线程数,或者如果由于您的应用程序的性质而这不可行,您可以使用更精细的方法来限制对共享资源的访问。在python中,您可以使用内置的信号量对象进行线程间同步。对于进程间同步(或线程间),您将使用posix_ipc。这取决于您的服务的执行模型是什么。
大多数数据库客户端不需要任何应用程序级别的限制。在典型的系统中,数据库连接将被合并,连接管理器将负责获取可用连接。在内部,这通常涉及某种带有超时的队列,以防止无限期地等待。然后,数据库本身将处理每个连接进行的各个操作的调度。
但是,信号量是一种信号原语,可用于限制并发操作的数量:https ://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Semaphore.html
任务也可以建模为涉及共享队列的生产者-消费者问题,但是除了生产者之外,您还必须处理管理消费者线程的额外复杂性。
推荐阅读
- powershell - Remove-Item 命令不会删除文件夹及其内容
- performance - 如何通过 CLI 运行详细的 LHCI 断言
- django - Django 保存 - 一次点击下两个订单
- wordpress - Wordpress 和 woocommerce 导致致命的崩溃
- c - V4L2:启动和停止流 - 需要请求缓冲区?
- android - 有没有办法强制 gradle 测试运行返回不同的退出代码?
- ios - Appdelegate.m 预期标识符或'('问题,如何解决?
- c# - c# Process.Start with credentials 在 WPF 应用程序中运行时总是“拒绝访问”,控制台工作正常
- flutter - 参数类型“图像?” 无法将参数类型分配给“Widget”,因为“Image?”
- database - 如何在已经存在的表中添加一列并在其中填写按 Oracle 服务器上的列排序的 ID?