【问题标题】:Cancel a group of HTTP requests in twisted在twisted中取消一组HTTP请求
【发布时间】:2010-10-05 08:50:38
【问题描述】:

我正在使用 twisted.web.client.getPage 发出几个 HTTP 请求,并且希望能够根据用户的请求取消其中的一些请求。理想情况下,我想做这样的事情:

# Pseudocode, getPage doesn't work like this:
getPage(url1, "group1")
getPage(url2, "group1")
getPage(url3, "group1")
...

# Later on
reactor.cancel_all("group1")

也许我可以将所有 Deferreds 添加到 DeferredList,但我有很多小请求,所以大多数请求无论如何都会在给定时间完成(另外,我不知道您是否可以将 Deferreds 添加到现有的 DeferredList)... 是否有更惯用的解决方案?

【问题讨论】:

    标签: python http twisted


    【解决方案1】:

    您正在描述两个不同的问题。首先,可以完全取消使用getPage 发出的HTTP 请求吗?不,它不能。其次,可以将操作组合在一起,以便可以同时取消它们。当然,这并不涉及任何特别的事情:

    def cancel(group):
        for job in group:
            job.cancel()
    
    group = []
    group.append(job1)
    group.append(job2)
    ...
    cancel(group)
    

    这里没有关于 Twisted 的特别之处 - 这只是创建一个集合,然后对其进行操作。你不需要反应堆的帮助或任何东西。您需要的是一种取消单个操作的方法。 Twisted 的最新版本添加了Deferred.cancel(因此,与 pyfunc 的答案中链接的旧帖子相反,Deferreds 确实有一个现在被取消的概念)。然而,要让它真正做任何事情,每个创建 Deferreds 的 API - 例如,getPage - 都必须更新以执行相关的取消操作。从 Twisted 10.1 开始,getPage 尚未更新。

    因此,您可以为 getPage 实现取消(并将其贡献给 Twisted,拜托!),或者您可以忘记实际取消 HTTP 请求,而只是在结果到达时忽略它。

    【讨论】:

      【解决方案2】:

      我没有提供解决方案,而是指出以下关于扭曲邮件列表的相关讨论。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-26
        • 1970-01-01
        • 2014-05-19
        • 2018-01-22
        相关资源
        最近更新 更多