我有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()
,但没有区别
如果有人对此有任何想法,那将是非常好的:)
答案 0 :(得分:0)
经过几次尝试,我删除了pycurl代码并测试以启动10k QThreads并停止了它,并且此工作完美无误。因此我将错误定义为pycurl代码。
根据问题评论中ekhumoro的建议,我可能会尝试使用pycurl multi
但是现在我将这一行添加到pycurl代码中:
c.setopt(c.TIMEOUT, self.timeOut)
我只用这个:
c.setopt (c.CONNECTTIMEOUT, self.timeOut)
现在两个参数都可以正常工作,启动和停止批量qthreads