以扭曲方式取消一组HTTP请求

时间:2010-10-05 08:50:38

标签: python http twisted

我正在使用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")

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

2 个答案:

答案 0 :(得分:1)

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

def cancel(group):
    for job in group:
        job.cancel()

group = []
group.append(job1)
group.append(job2)
...
cancel(group)

这里没有什么特别的扭曲 - 这只是创建一个集合,然后对它进行操作。你不需要反应堆帮助或任何东西。您需要的是取消单个操作的方法。 Twisted的最新版本添加Deferred.cancel(因此,与pyfunc的答案中链接的旧帖子相反,Deferreds确实有一个被取消的概念)。但是,为了实际执行任何操作,必须更新创建Deferreds的每个API(例如,getPage)以执行相关的取消操作。截至Twisted 10.1,getPage尚未更新。

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

答案 1 :(得分:0)

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