退出1000个QThread-pyqt5

时间:2018-07-02 23:51:53

标签: qt pyqt pyqt5 exit qthread

我有python个GUI应用,使用的是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将停止while self.x类中的workerClass并退出并等待,应关闭所有线程

所有这一切都正常工作,但仅在线程数量较少(10个或可能为100个)中起作用 但是,如果我要执行1000个线程,则要花很多时间,我要等待10分钟,但并没有停止(平均线程未终止),但是pycurl超时只有15秒

我还使用了:self.thread.exit() self.thread.quit() self.thread.terminate(),但没有区别

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

1 个答案:

答案 0 :(得分:0)

经过几次尝试,我删除了pycurl代码并测试以启动10k QThreads并停止了它,并且此工作完美无误。因此我将错误定义为pycurl代码。

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

但是现在我将这一行添加到pycurl代码中:

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

我只用这个:

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

现在两个参数都可以正常工作,启动和停止批量qthreads