2010-10-05 6 views
1

Je fais plusieurs requêtes HTTP avec twisted.web.client.getPage, et j'aimerais pouvoir annuler certaines d'entre elles à la demande de l'utilisateur. Idéalement, je voudrais faire quelque chose comme:Annuler un groupe de requêtes HTTP en tordu

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

# Later on 
reactor.cancel_all("group1") 

Peut-être que je pourrais ajouter tous les Deferreds à un DeferredList, mais j'ai beaucoup de petites demandes, de sorte que la plupart des demandes serait fini à toute façon le temps donné (De plus, je ne sais pas si vous pouvez ajouter Deferreds à une liste différée existante) ... Existe-t-il une solution plus idiomatique?

Répondre

1

Vous décrivez deux questions distinctes. Premièrement, une requête HTTP faite avec getPage peut-elle être annulée? Non, ça ne peut pas. Deuxièmement, les opérations peuvent être regroupées de sorte qu'elles puissent toutes être annulées simultanément. Bien sûr, cela n'implique pas quelque chose de très spécial:

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

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

rien de particulier Twisted ici - c'est juste de créer une collection et d'exploitation sur elle. Vous n'avez pas besoin du réacteur pour aider ou quoi que ce soit. Ce dont vous avez besoin est un moyen d'annuler une opération individuelle. La dernière version de Twisted ajoute Deferred.cancel (donc, contrairement à l'ancien post lié à la réponse de pyfunc, les différés ont la notion d'être annulé maintenant). Cependant, pour que cela fonctionne réellement, chaque API qui crée Deferreds - par exemple, getPage - doit être mise à jour pour effectuer l'opération d'annulation correspondante. À partir de Twisted 10.1, getPage n'a pas été mis à jour.

Vous pouvez donc soit mettre en œuvre l'annulation pour getPage (et contribuer à Twisted, s'il vous plaît!) Ou vous pouvez oublier d'annuler réellement la requête HTTP et ignorer simplement le résultat quand il arrive.