есть программа для проверки прокси на валидность
python 3.2, pyqt4
по нажатию кнопки Старт запускается метод класса главного окна, который создает многопоточность:
self.executor = ThreadPoolExecutor(max_workers=100) # 100 потоков
self.pending = set() # очередь
# можно ли сразу поместить сюда список прокси?
#self.future = self.executor.submit(self.worker, proxies)
# добавляем прокси в экзекутор
for proxy in proxies:
future = self.executor.submit(self.worker, proxy)
future.add_done_callback(self.process_result) # функция для обработки результата и обновления гуи
self.pending.add(future)
def worker(self, proxy):
# проверяем прокси, если всё ок возвращаем [1, proxy] либо [0, proxy]
def process_result(self, future):
self.pending.discard(future)
if future.cancelled():
return
res, proxy = future.result()
print(res, proxy)
# increment progress bar
self.progress()
if res == 1:
self.textEdit('proxy_valid', 'add', proxy) # добавляем прокси в textEdit (это просто сокращение для self.ui.textEdit_proxy.appendPlainText(proxy))
# increment counter valid
self.lbl('valid')
elif res == 3:
pass
#self.log('bad format')
elif res == 4:
pass
#self.log('proxy down')
else:
self.lbl('invalid')
#self.log('no text')
#remove from 1st field
self.textEdit('proxy', 'del', proxy)
#decrement total
self.lbl('total', '-')
self.app.processEvents() # обновляем гуи, чтобы не зависал
app = QtGui.QApplication(sys.argv)
form = run(app)
form.show()
sys.exit(app.exec_())
счётчики обновляются нормально, однако при попытке что-либо дописывать в textEdit'ы - в консоль валятся ошибки:
X Error: RenderBadGlyphSet (invalid GlyphSet parameter) 161
Extension: 148 (RENDER)
Minor opcode: 25 (RenderCompositeGlyphs32)
Resource id: 0x26
и
QWidget::repaint: Recursive repaint detected
самое главное что я хочу узнать - можно ли напрямую обновлять self.ui из метода def process_result(self, future) ?
или это должно делаться иначе и все глюки от параллельного обращения к этому методу (и соотв. к уи) разных потоков?