Я хочу написать асинхронный http-клиент с использованием скрученной структуры, которая каждые 5 запросов асинхронно/одновременно запускает 5 разных серверов. Затем сравните эти ответы и покажите результат. Может кто-то может помочь в этом.написать асинхронный http-клиент, используя скрученную фреймворк
ответ
Для создания асинхронных HTTP-запросов вам необязательно twisted
. Вы можете использовать потоки python и замечательный пакет requests
.
from threading import Thread
import requests
def make_request(url, results):
response = requests.get(url)
results[url] = response
def main():
results = {}
threads = []
for i in range(5):
url = 'http://webpage/{}'.format(i)
t = Thread(target=make_request, kwargs={'url': url, 'results': results})
t.start()
threads.append(t)
for t in threads():
t.join()
print results
Это не отвечает на вопрос. Это лучше подходит для комментариев. OP может уже иметь скрученную настройку. Кроме того, нить и асинхронный IO не являются одинаковыми. – taskinoor
Спасибо за предложение, но требования таковы, что мне нужно сделать это с помощью скрученного. – mukesh
Проблема с вашим ответом заключается в том, что он заблокирует ожидание завершения каждого потока. Хотя это все равно не сделает ваш вопрос правильным, '' просит'' поддерживает '' gevent'', который должен устранить '' .join() '' вызовы atleast. Чтобы использовать подобный подход в twisted, вы можете использовать '' deferToThread() '' для запуска каждого запроса в потоке –
В этой ситуации я предлагаю использовать treq
и DeferredList
агрегировать ответов затем огонь обратного вызова, когда все адреса были возвращены. Вот краткий пример:
import treq
from twisted.internet import reactor, defer, task
def fetchURL(*urls):
dList = []
for url in urls:
d = treq.get(url)
d.addCallback(treq.content)
dList.append(d)
return defer.DeferredList(dList)
def compare(responses):
# the responses are returned in a list of tuples
# Ex: [(True, b'')]
for status, content in responses:
print(content)
def main(reactor):
urls = [
'http://swapi.co/api/films/schema',
'http://swapi.co/api/people/schema',
'http://swapi.co/api/planets/schema',
'http://swapi.co/api/species/schema',
'http://swapi.co/api/starships/schema',
]
d = fetchURL(*urls) # returns Deferred
d.addCallback(compare) # fire compare() once the URLs return w/ a response
return d # wait for the DeferredList to finish
task.react(main)
# usually you would run reactor.run() but react() takes care of that
В функции main
, список URL-адресов передаются в fecthURL()
. Там каждый сайт сделает асинхронный запрос и вернет Deferred
, который будет добавлен к list
. Затем окончательный список будет использоваться для создания и возврата объекта DeferredList
. Наконец, мы добавляем обратный вызов (compare()
в этом случае) на DeferredList
, который будет получать доступ к каждому ответу. Вы бы поставили свою логику сравнения в функцию compare()
.
Нужно ли использовать витой? Вы можете делать асинхронные запросы без искажений. –