2016-10-23 8 views
0

Я хочу написать асинхронный http-клиент с использованием скрученной структуры, которая каждые 5 запросов асинхронно/одновременно запускает 5 разных серверов. Затем сравните эти ответы и покажите результат. Может кто-то может помочь в этом.написать асинхронный http-клиент, используя скрученную фреймворк

+0

Нужно ли использовать витой? Вы можете делать асинхронные запросы без искажений. –

ответ

-2

Для создания асинхронных 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 
+0

Это не отвечает на вопрос. Это лучше подходит для комментариев. OP может уже иметь скрученную настройку. Кроме того, нить и асинхронный IO не являются одинаковыми. – taskinoor

+1

Спасибо за предложение, но требования таковы, что мне нужно сделать это с помощью скрученного. – mukesh

+0

Проблема с вашим ответом заключается в том, что он заблокирует ожидание завершения каждого потока. Хотя это все равно не сделает ваш вопрос правильным, '' просит'' поддерживает '' gevent'', который должен устранить '' .join() '' вызовы atleast. Чтобы использовать подобный подход в twisted, вы можете использовать '' deferToThread() '' для запуска каждого запроса в потоке –

1

В этой ситуации я предлагаю использовать 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().

 Смежные вопросы

  • Нет связанных вопросов^_^