Я пытаюсь создать список Deferred
объектов, используя DeferredList или collectResults .Я нашел разные результаты при работе с этими двумя.Я работаю с pymodbus 2.1.0 & Twisted 18.4.0 библиотек.
Ссылка: Я ссылался на эту ссылку Отложенная ссылка - Лаборатория скрученных матриц (18.4.0) .
DeferredList Usecase: Когда я использую DeferreList
с consumeErrors=True
, вызывается результат обратного вызова Deferred
и затем выполняется callback
из DeferredList
.Если в объекте Deferred
имеется какая-либо ошибка, в этом случае errorback
из DeferredList
не выполняется.
DeferredListCallback Result : Ниже приведен результат DeferredList
когда нет доступного устройства Modbus для чтения данных.
INFO:service.TestService: (2019-02-21 15:58:39; TestService.py:21 Reading HRs of Modbus RTU device...)
INFO:__main__: (2019-02-21 15:59:09; Test.py:125 Reading HRs of Modbus RTU device completed successfully.)
INFO:service.TestService: (2019-02-21 15:59:09; TestService.py:32 Reading IRs of Modbus RTU device...)
collectResults Сценарий использования: В случае gatherResults
, при успешном вызове всех Deferred
объектов обратный вызовgatherResults
выполнено.Если при выполнении какого-либо объекта Deferred
произошла ошибка, то вызывается ошибка и на консоли выводится stacktrace.
collectResultsErrorback Результат: Ниже приведен результат gatherResults
, когдаодин из объектов Deferred
пытается прочитать данные с устройства Modbus, которое недоступно.
INFO:service.TestService: (2019-02-21 15:58:39; TestService.py:21 Reading HRs of Modbus RTU device...)
INFO:__main__: (2019-02-21 15:50:38; Test.py:212 Error reading HRs of Modbus RTU device : [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.defer.FirstError'>: FirstError[#0, [Failure instance: Traceback: <class 'twisted.internet.defer.TimeoutError'>: (30, 'Deferred')
C:\Users\xxx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\twisted\internet\defer.py:385:timeItOut
C:\Users\xxx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\twisted\internet\defer.py:544:cancel
C:\Users\xxx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\twisted\internet\defer.py:500:errback
C:\Users\xxx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\twisted\internet\defer.py:567:_startRunCallbacks --- <exception caught here> --- C:\Users\xxx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\twisted\internet\defer.py:653:_runCallbacks
C:\Users\xxx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\twisted\internet\defer.py:394:convertCancelled
C:\Users\xxx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\twisted\internet\defer.py:860:_cancelledToTimedOutError ]]].)
Я не понял внутреннюю реализацию.Почему эти два разных результата в одном и том же сценарии.Что следует использовать, когда?Какая из двух лучших?
Может кто-нибудь дать четкое представление об этом?