Как я могу отправить запрос 5000 JSON как можно быстрее в python? - PullRequest
0 голосов
/ 07 апреля 2020

Позвольте мне сначала объяснить, что я собираюсь делать, я тестирую API своего веб-сервера. Я новичок в python и хотел бы отправить следующий запрос 5000 раз как можно быстрее (одна секунда или меньше - это идеально). Для меня важно только то, что эти 5000 запросов поступают на мой сервер одновременно, и я могу выяснить возможности сервера. Мой запрос в bash

1002 *

Ответы [ 3 ]

1 голос
/ 07 апреля 2020

вы, вероятно, можете использовать Grequest, чтобы в основном использовать gevent для ваших запросов:

import grequests

urls = [
    'http://www.heroku.com',
    'http://tablib.org',
    'http://httpbin.org',
    'http://python-requests.org',
    'http://kennethreitz.com'
]
rs = (grequests.get(u) for u in urls)

>>> grequests.map(rs)
[<Response [200]>, <Response [200]>, <Response [200]>, <Response [200]>, <Response [200]>]

другой способ go - это использовать событие asyncio l oop (аналогично js), этот подход вероятно, более современный и не использует gevent, который несовместим с некоторыми другими сторонними библиотеками:

#!/usr/local/bin/python3.5
import asyncio
from aiohttp import ClientSession

async def fetch(url, session):
    async with session.get(url) as response:
        return await response.read()

async def run(r):
    url = "http://localhost:8080/{}"
    tasks = []

    # Fetch all responses within one Client session,
    # keep connection alive for all requests.
    async with ClientSession() as session:
        for i in range(r):
            task = asyncio.ensure_future(fetch(url.format(i), session))
            tasks.append(task)

        responses = await asyncio.gather(*tasks)
        # you now have all response bodies in this variable
        print(responses)

def print_responses(result):
    print(result)

loop = asyncio.get_event_loop()
future = asyncio.ensure_future(run(4))
loop.run_until_complete(future)
1 голос
/ 08 апреля 2020

Это похоже на ответ Максима Дунавичера в том, что он использует aiohttp для выполнения асинхронных запросов, так что несколько запросов могут выполняться одновременно. В отличие от его подхода, который пытается сохранить соединение открытым для повторного использования среди одновременных запросов, это не так. Однако, когда я проверил производительность этого на моем локальном Apache сервере, используя N = 100, я обнаружил, что это завершается примерно в трети времени, для чего у меня нет хорошего объяснения.

import asyncio
from aiohttp import ClientSession

N = 5000

async def get(url):
    async with ClientSession() as session:
        async with session.get(url) as response:
            return await response.read()

loop = asyncio.get_event_loop()

coroutines = [get(f"http://localhost?x={i}") for i in range(N)]
results = loop.run_until_complete(asyncio.gather(*coroutines))
#print(results)
0 голосов
/ 07 апреля 2020

Для тестирования json запросов лучше использовать ab (apache тестовый инструмент).

http://httpd.apache.org/docs/2.4/programs/ab.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...