【发布时间】:2018-12-11 04:50:26
【问题描述】:
我有使用 Qt 的 python gui 应用程序
我正在使用pyqt5
应用应创建 1000 个或更多 Qthreads,每个线程将使用 pycurl 打开外部 URL
我正在使用此代码打开线程:
self.__threads = []
# workerClass thread
for i in range(1000):
workerInstance = workerClass()
workerInstance.sig.connect(self.ui.log.append)
thread = QThread()
self.__threads.append((thread, workerInstance))
workerInstance.moveToThread(thread)
thread.started.connect(workerInstance.worker_func)
thread.start()
WorkerClass 将使用简单的pycurl 访问外部 URL 并发出信号以在日志中添加一些信息,代码如下:
class workerClass(QObject):
x = 1
sig = pyqtSignal(str)
def __init__(self, linksInstance, timeOut):
super().__init__()
self.linksInstance = linksInstance
self.timeOut = timeOut
@pyqtSlot()
def worker_func(self):
while self.x:
# run the pycurl code
self.sig.emit('success!') ## emit success message
现在的问题是停止这一切,我使用下面的代码作为停止按钮:
def stop_func(self):
workerClass.x = 0
if self.__threads:
for thread, worker in self.__threads:
thread.quit()
thread.wait()
将workerClass.x 更改为0 将停止workerClass 类中的while self.x 并退出并等待应该关闭所有线程
所有这些都正常工作,但仅在少量线程中,10 或可能是 100
但是如果我运行 1000 个线程,这需要很长时间,我等待了 10 分钟但它没有停止(意味着线程没有终止),但是 pycurl 超时只有 15 秒
我也用过:self.thread.exit()self.thread.quit()self.thread.terminate(),但没有区别
如果有人对此有任何想法,那就太好了:)
【问题讨论】:
-
您是否有任何证据表明使用 1000 个线程可以带来任何好处?如果没有,您真的应该在假设添加更多线程会提高性能之前进行一些测试。我怀疑你会发现,在 python 中,使用相对较小的线程池会更有效。例如,请参阅:Optimal Number of Threads in Python。
-
是的,使用
pycurl会有很大的不同,而且这个应用程序是一个通用应用程序,用户应该选择他想要使用的线程数。 -
我不明白为什么用户应该关心这样的实现细节。
-
PS:你考虑过使用pycurl multi吗?
-
这些细节让用户可以完全控制选择速度和/或其他因素,因此他可以选择超时和线程数量,也感谢您尝试 pycurl multi 的建议,我会对其进行测试,因为它也可能会提供更好的性能!
标签: qt pyqt pyqt5 exit qthread