Зачем в workere? Вызывайте в главном потоке, прямо в обработчике сигнала.
Да, размер меняется и это нехорошо. Итерируйтесь по копии.
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
AttributeError: 'list' object has no attribute 'add'
AttributeError: 'list' object has no attribute 'discard'
for f in set(self.pending):
if not f.cancelled():
f.cancel()