использовать параллельные фьючерсы с входом генератора - PullRequest
0 голосов
/ 02 июля 2019

Я загружаю некоторую информацию с веб-страниц в виде

http://example.com?p=10
http://example.com?p=20
...

Дело в том, что я не знаю, сколько их. В какой-то момент я получу сообщение об ошибке от сервера, или, может быть, в какой-то момент я захочу остановить обработку, так как мне достаточно. Я хочу запустить их параллельно.

def generator_query(step=10):
   i = 0
   yield "http://example.com?p=%d" % i
   i += step
def task(url):
    t = request.get(url).text
    if not t:  # after the last one
       return None
    return t

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

Несовременный пример:

results = []
for url in generator_query():
    results.append(task(url))

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Вы можете использовать aiohttp для этой цели:

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

async def coro(step):
    url = 'https://example.com?p={}'.format(step)
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, url)
        print(html)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    tasks = [coro(i*10) for i in range(10)]
    loop.run_until_complete(asyncio.wait(tasks))

Что касается ошибки на странице, вам, возможно, придется это выяснить самостоятельно, поскольку я не знаю, с каким веб-сайтом вы имеете дело. Может попробовать ... кроме?

Примечание: если ваша версия python выше 3.5, это может вызвать ошибку проверки сертификата ssl.

0 голосов
/ 02 июля 2019

Вы можете использовать одновременный ThreadPoolExecutor .Пример того, как его использовать, приведен здесь .
Вам нужно будет выйти из цикла for примера, когда вы получаете неверные ответы с сервера (за исключением ) или всякий раз, когда вы чувствуете, что получили достаточно данных (например, вы можете сосчитать действительные ответы в разделе else ).

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