我有用於一次增量更新一個大的(> 1K)列表中的一個片一個defer.inlineCallback
功能。這個列表隨時可能發生變化,並且由於這種行爲我得到了錯誤。循環通過改變數據集inlineCallbacks /產率(蟒加捻)
的我在做什麼,最簡單的表示是: -
@defer.inlineCallbacks
def _get_details(self, dt=None):
data = self.data
for e in data:
if needs_update(e):
more_detail = yield get_more_detail(e)
do_the_update(e, more_detail)
schedule_future(self._get_details)
self.data
是最初使用在應用程序啓動的基本信息(如姓名和ID)的詞典列表。 _get_details
將在反應堆允許的情況下運行,以獲取數據中每個項目的更詳細信息,隨着項目的進行更新項目。
這種運作良好,當self.data
不會改變,但一旦它被改變(可以在任何點)的循環顯然指的是錯誤的信息。事實上,在這種情況下,最好是完全停止循環。
我能當數據被更改設置標誌在我的課(其中inlineCallback
可以再檢查)。
- 應該在哪裏這張支票進行?
- 怎樣的
inlineCallback
代碼中執行比正常deferred
(實際上是一個普通的Python發電機)。 - 是否執行代碼停止,每次遇到
yield
(即我可以依靠一個yield
和下一個是原子之間的代碼)? - 在不可靠的大名單的情況下,我應該甚至可以通過數據(
for e in data
)循環,或者是有沒有更好的辦法?
謝謝,這是我的結論。關於用例,我的應用程序是事件驅動的,但由於更新既冗長又可分割,而且基於相對不穩定的數據,我正在採用盡力而爲的狀態驅動解決方案,它只是試圖更新任何需要更新,然後讓反應堆繼續。之前基於線程的「後臺更新」嘗試更糟,因爲更新幾乎可以保證在完成時出錯(對於當前數據集更新需要20-30秒)。 –