quit 1000 of QThread - pyqt5



pythongui 应用程序使用Qt

我正在使用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()但没有区别

如果有人对此有任何想法,这将是非常棒的:)

经过一些尝试,我删除了 pycurl 代码并测试以启动 10k QThreads 并停止它,这工作完美,没有任何错误。 所以我定义错误出在 pycurl 代码上。

根据 ekhumoro 在问题评论中的建议,我可能会尝试使用 pycurl multi

但现在我在 pycurl 代码中添加了这一行:

c.setopt(c.TIMEOUT, self.timeOut)

我只使用这个:

c.setopt (c.CONNECTTIMEOUT, self.timeOut)

所以现在有了这两个参数,一切都正常工作,启动和停止批量 qthreads

相关内容

  • 没有找到相关文章

最新更新