Немедленная обработка асинхронных ответов - PullRequest
0 голосов
/ 02 января 2019

Мне нужно повторно проанализировать одно содержание ссылки.синхронный способ дает мне 2-3 ответа в секунду, мне нужно быстрее (да, я знаю, что слишком быстро тоже плохо)

Я нашел несколько асинхронных примеров, но все они показывают, как обрабатывать результат в конце концовссылки анализируются, тогда как мне нужно разобрать его сразу после получения, что-то вроде этого, но этот код не дает никакого улучшения скорости:

import aiohttp
import asyncio
import time
async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    while True:
        async with aiohttp.ClientSession() as session:
            html = await fetch(session, 'https://example.com')
            print(time.time())
            #do_something_with_html(html)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

Ответы [ 2 ]

0 голосов
/ 13 января 2019

, но этот код не дает никакого улучшения скорости

asyncio (и асинхронность / параллелизм в целом) дает улучшение скорости для операций ввода-вывода, которые чередуются друг с другом.

Когда все, что вы делаете, это await something и вы никогда не создаете никаких параллельных задач (используя asyncio.create_task(), asyncio.ensure_future() и т. Д.), Тогда вы в основном выполняете классическое синхронное программирование:)

Итак, какчтобы сделать запросы быстрее:

import aiohttp
import asyncio
import time

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

async def check_link(session):
    html = await fetch(session, 'https://example.com')
    print(time.time())
    #do_something_with_html(html)

async def main():
    async with aiohttp.ClientSession() as session:
        while True:
            asyncio.create_task(check_link(session))
            await asyncio.sleep(0.05)

asyncio.run(main())

Обратите внимание: async with aiohttp.Cliensession() as session: должно быть выше (снаружи) while True:, чтобы это работало.На самом деле, в любом случае наличие единого ClientSession() для всех ваших запросов является хорошей практикой.

0 голосов
/ 02 января 2019

Я отказался от использования асинхронного программирования, благодаря решению этой проблемы с потоками https://stackoverflow.com/a/23102874/5678457

from threading import Thread
import requests
import time
class myClassA(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.daemon = True
        self.start()
    def run(self):
        while True:
            r = requests.get('https://ex.com')
            print(r.status_code, time.time())
for i in range(5):
    myClassA()
...