gpt4 book ai didi

python - 我应该如何使用 Twisted 构建批处理管道?

转载 作者:行者123 更新时间:2023-11-28 18:47:07 25 4
gpt4 key购买 nike

我正在缓慢但肯定地掌握扭曲的窍门,但我不确定我应该如何处理这个特定项目。

我正在尝试创建一个用于网页批处理的类。我想独立处理多个网页,因此为每个 url 设置一个管道是有意义的。此外,我想在处理任何 url 之前调用一次性预处理函数,并且在处理完所有 url 后,我想调用一个后处理函数。重要的是,我希望能够继承这个处理类并根据我要处理的内容覆盖某些方法——并非所有网页都需要相同的处理步骤。

如果这是同步代码,我可能会使用上下文管理器来完成。考虑以下示例代码:

class Pipeline(object):
def __init__(self, urls):
self.urls = urls # iterable
self.continue = False

def __enter__(self):
self.continue = self.preprocess()

def __exit__(self, type, value, traceback):
if self.continue: # if we decided to run the batch pipeline...
self.postprocess()

def preprocess(self):
# does some stuff and returns a bool

def postprocess(self):
# do some stuff

def pipeline(self):
for url in self.urls:
try:
# download url, do some stuff
except:
# recover so that other urls are not interrupted

之后,我将按如下方式使用它:

with Pipeline(list_of_urls) as p:
p.pipeline()

这适用于同步网络操作,但不适用于 Twisted,因为管道函数将在处理管道结束之前返回,从而调用 __exit__

此外,我希望每个 URL 的处理完全独立进行,因为可能存在基于我的查询结果的条件分支。出于这个原因,使用 Twisted 的 DeferredList 是不可取的。

简而言之,我需要以下内容:

  • 必须先运行预处理
  • 后处理必须在满足以下条件时运行:
    • 至少有一个 url 开始处理(预处理返回 True)
    • 所有 url 已完成或抛出异常

用 Twisted 设置这样的东西最明智的方法是什么?我遇到的问题是一些代码涉及异步 IO 而一些只是直接同步逻辑(即在内存中处理结果),所以我不确定如何使整个事情与 deferreds 一起工作(或者我是否甚至应该)。

有什么建议吗?

最佳答案

根据对原始问题的评论,我建议将 DeferredList 与 maybeDeferred 结合使用.因此我建议后者:

The issue I'm having is that some of the code involves asynchronous IO and some is just straight synchronous logic (i.e. processing the results in memory), so I'm not sure how to make the whole thing work with deferreds (or whether I even should).

使用 maybeDeferred 可以让您将所有函数调用视为异步,无论它们实际上是否异步。

关于python - 我应该如何使用 Twisted 构建批处理管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18305686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com