2010-10-05 117 views
1

我正在用twisted.web.client.getPage發出幾個HTTP請求,並希望能夠根據用戶的請求取消一些請求。理想情況下,我想這樣做:取消一組扭曲的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中)...還有更習慣的解決方案嗎?

回答

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確實有一個被取消的概念)。但是,爲了實際執行任何操作,每個創建延遲的API(例如getPage)都必須更新以執行相關的取消操作。從扭曲10.1開始,getPage尚未更新。

因此,您可以實現getPage的取消(並將其提供給Twisted,請!),或者您可以忘記實際取消HTTP請求,而是在到達時忽略結果。