Форум сайта python.su
0
здравствуйте
запускать потоки научился, но не могу понять как их теперь остановить
запускаю так:
self.executor = ThreadPoolExecutor(max_workers=self.threads)
self.pending = set()
for proxy in proxies:
future = self.executor.submit(self.worker, proxy)
future.add_done_callback(self.process_result)
self.log('проверяем ' + proxy)
self.pending.add(future)
self.app.processEvents()
Офлайн
14
Вот именно флаг и должен помогать. Нужно остановится - проверили это в self.worker и завершились.
Фраза вроде: “я все перепробовал, но ничего не подошло” не очень информативна.
Офлайн
0
пробовал так:
def process_result(self, future):
self.pending.discard(future)
if self.stopCheck:
future.cancel() # или просто делал здесь ретурн
if future.cancelled():
return
res, proxy = future.result()
self.emit(QtCore.SIGNAL("threadDone"), [res, proxy]) # и в threadDone пробовал тоже ставить ретурн
def worker(self, proxy):
''' thread body '''
self.emit(QtCore.SIGNAL("threadStarted"))
if self.stopCheck: # тоже бестолку
return [5, proxy]
if ':' not in proxy:
return [3, proxy]
try:
hnd = http.client.HTTPConnection(proxy, timeout=1)
hnd.request('GET', self.checkUrl, '', {'Content-Type': 'application/x-www-form-urlencoded'})
body = hnd.getresponse().read().decode(self.charsetToCheck)
return [1, proxy] if self.checkText in body else [0, proxy]
except:
return [4, proxy]
def stop(self):
self.stopCheck = True
self.log('останавливаем проверку')
Офлайн
14
Стоп-стоп.
У вас 100 заданий. 35 закончились, 10 еще работают, 45 ждут свободных потоков в executor.
Что должна сделать остановка?
Офлайн
0
прервать оставшихся. чтобы они, получив свободные потоки - не чекали прокси, не делали свою работу, а просто завершались тихо
Офлайн
0
кто-нибудь знает как это сделать?
Офлайн
14
Послушайте. У вас же есть self.pending.
Сделайте для них .cancel
Или я чего-то не понимаю?
Офлайн
0
так я же делал:
def process_result(self, future):
self.pending.discard(future)
if self.stopCheck:
future.cancel() # или просто делал здесь ретурн
if future.cancelled():
return
Отредактировано (Янв. 26, 2011 21:49:41)
Офлайн
14
Нет-нет.
.process_result вызовется, когда ваш worker уже отработает.
А если в реакции на кнопку “стоп” сделать
for f in self.pending:
f.cancel()
эффект будет другой.
Офлайн
0
да, вроде я понял как это произойдет. и вызвать это надо в workere?
попробовал. теперь работает - проверка останавливается, спасибо большое.
но после такой остановки в консоли появляется:
File "main.py", line 208, in worker
for f in self.pending:
RuntimeError: Set changed size during iteration
Офлайн