我目前正在尝试实现多线程数据库连接接口供个人使用。这是使用3个类
实现的DatabaseManager
数据库连接实例为每个连接实例化一个新线程Database
一个继承自QThread的对象,意味着在主线程中运行并公开一个接口来处理一个worker对象DatabaseWorker
在管理单个数据库连接的工作线程中运行事件循环的工作对象,等待查询并通过Qt:QueuedConnections(signal / slots)传递结果close()
方法),它的相关事件循环将停止并删除该线程。其目的是将线程创建和删除保持在最低限度。在应用程序计数器中有很多线程有效吗?如果我同时打开50/100/500/1000连接会怎么样?如果我这样做,I / O数据库操作将花费大量时间来完成(它首先没有为此设计)但是这个延迟有多少是由线程数引起的?
答案 0 :(得分:2)
线程数本身并不是一个大问题。每一个都使用一些内存,但对于现代机器而言,开销并不大。
当所有这些线程开始尝试一次完成工作时,主要问题就出现了,他们开始争取资源,最终结果会比较少的线程更聪明地得到更快的结果。
线程池是这种情况的常见解决方案,其中任务排队等待执行,并且您有一个线程池,其中包含适合您的计算机的线程数(例如,每个核心一个线程)处理项目离开队列。如果您的线程花费大量时间闲置等待响应,则可能需要更多线程,如果他们不断进行计算,那么添加更多可能实际上会减慢速度。
测量性能并相应调整:)“Gut feel”在演奏时非常不可靠。
答案 1 :(得分:0)
我会说是的,这是适得其反的。每个线程占用大量内存用于其堆栈空间,如果您只有6个内核,则无法并行运行100个线程。改为使用线程池,例如通过KF5 ThreadWeaver或Qt Concurrent,注意理想的线程数。