我有用于一次增量更新一个大的(> 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秒)。 –