Отменить группу HTTP-запросов в витой - PullRequest
1 голос
/ 05 октября 2010

Я делаю несколько HTTP-запросов с twisted.web.client.getPage и хотел бы иметь возможность отменить некоторые из них по запросу пользователя.В идеале я хотел бы сделать что-то вроде:

# 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) ... Есть ли более идиоматическое решение?

Ответы [ 2 ]

1 голос
/ 05 октября 2010

Вы описываете две отдельные проблемы. Во-первых, можно ли вообще отменить HTTP-запрос, сделанный с getPage? Нет не может Во-вторых, можно ли сгруппировать операции, чтобы их можно было одновременно отменить. Конечно, в этом нет ничего особенного:

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

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

Здесь нет ничего особенного в Twisted - это просто создание коллекции и последующая работа над ней. Вам не нужен реактор, чтобы помочь или что-нибудь. Что вам нужно, это способ отменить отдельную операцию. Последний выпуск Twisted добавляет Deferred.cancel (поэтому, в отличие от более раннего поста, на который есть ссылка в ответе pyfunc, у Deferreds есть идея быть отмененным сейчас). Однако для того, чтобы это действительно что-то делало, каждый API, который создает Deferreds - например, getPage - должен быть обновлен для выполнения соответствующей операции отмены. Начиная с Twisted 10.1, getPage не обновлялось.

Таким образом, вы можете либо реализовать отмену для getPage (и добавить ее в Twisted, пожалуйста!), Либо можете забыть о фактической отмене HTTP-запроса и вместо этого просто игнорировать результат при его получении.

0 голосов
/ 05 октября 2010

Я не предоставляю решение, но указываю на следующее соответствующее обсуждение по искаженному списку рассылки.

...