Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 27, 2011 17:46:33

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

как прервать работу потоков в concurrent.futures?

Зачем в workere? Вызывайте в главном потоке, прямо в обработчике сигнала.
Да, размер меняется и это нехорошо. Итерируйтесь по копии.



Офлайн

#2 Янв. 29, 2011 15:54:22

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

как прервать работу потоков в concurrent.futures?

если сделать копию:

            cp = set()
cp |= self.pending
for f in cp:
f.cancel()
не работает:

  File "/usr/local/lib/python3.2/concurrent/futures/_base.py", line 391, in result
raise CancelledError()
concurrent.futures._base.CancelledError
если итерировать по копии - я не знаю как получить элемент из self.pending
это множество set() и питон говорит что к нему нельзя обращаться по индексу

а если изменить тип self.pending на list, то валятся ошибки:
AttributeError: 'list' object has no attribute 'add'
AttributeError: 'list' object has no attribute 'discard'
как же тогда итерироваться по копии?



Офлайн

#3 Янв. 29, 2011 17:50:29

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

как прервать работу потоков в concurrent.futures?

for f in set(self.pending):
if not f.cancelled():
f.cancel()
Как-то так.



Офлайн

#4 Фев. 2, 2011 08:12:06

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

как прервать работу потоков в concurrent.futures?

отлично! теперь работает как надо и без ошибок :)
огромное спасибо!



Отредактировано (Фев. 2, 2011 08:12:23)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version