2014-12-12 2 views
0

У меня есть несколько заданий в DeferredList, и иногда рабочий может сбрасывать ошибку. Как остановить все Deferrs in Отложенный список? если что-то пойдет не так в рабочийTwisted - Остановить все отложенные в DeferredList

def worker(word): 
    #can throw Exception 
    return word.upper() 

def worker_err(error): 
    #todo: stop all deffered in list 
    return 0 

def processing(words): 
    workers_list = [] 
    for word in words: 
     workers_list.append(threads.deferToThread(worker, words).addErrback(worker_err)) 

    return defer.DeferredList(workers_list) 


words = ['abc', 'test string', 'test'] 

d = processing(words) 

ответ

2

Deferreds не работают операции. Вы не можете остановить Отсрочку. Вы можете использовать API Deferred.cancel, чтобы попытаться остановить операцию, связанную с Deferred, но это механизм отказа: операция должна явно включать отмену или Deferred.cancel фактически не остановит операцию.

Нити в Python не прерываются. Deferred, возвращенный с deferToThread, поэтому не выбирает механизм отмены. Вы не можете остановить базовую операцию.

Вы можете реализовать свой собственный механизм прерывания для вашей рабочей функции. Например, вы можете совместно использовать экземпляр threading.Event между основным потоком и рабочей функцией. Если вы хотите остановить поток, установите событие. В функции работника время от времени проверяйте событие, чтобы узнать, установлено ли оно. Если это так, откажитесь от работы.

Смежные вопросы