как использовать asyncio и multiprocess.map для получения данных - PullRequest
2 голосов
/ 29 марта 2019

Я использую asyncio для получения веб-страницы.

Однако скорость не очень высокая.

Вот код:

async def get_page_url(url, session):
    res = await session.request(method="GET", url=url)
    return await res.text()

async def main_get_page_url(urls):      
    async with ClientSession() as session:
    tasks = [get_page_url(url, session) for province, url in urls]
    result = await asyncio.gather(*tasks)
    return result

if __name__ == '__main__':
    urls = ['http://www.cnn.com', 'http://www.bbc.com']
    loop = asyncio.ProactorEventLoop()
    asyncio.set_event_loop(loop)
    loop = asyncio.get_event_loop()
    df = loop.run_until_complete(main_get_page_url(urls))

Я хочуиспользуйте multiprocessing.pool и карту для увеличения скорости.

Я искал в Интернете, но не могу найти какой-либо хороший метод.

Как изменить код?

Еще лучшеподход?

Большое спасибо

1 Ответ

1 голос
/ 29 марта 2019

Вы не достигнете ничего, используя больше процессов. 99% времени выполнения скрипта занимает сетевой ввод / вывод, который вы уже обрабатываете с помощью asyncio.gather. Только 1% времени занимает процессор. На его оптимизацию уже не стоит тратить время и увеличивать сложность кода. Если фактическая стоимость порождения нескольких процессов может вместо этого замедлить ваш скрипт.

Если вы думаете, что ваш код работает медленнее, чем следует, вы должны сначала найти узкое место и попытаться его оптимизировать. Ничего больше не могу вам помочь без полностью воспроизводимого примера с реальным кодом, URL-адресами и измерениями времени.


Отказ от ответственности:

99% времени выполнения скрипта занимает сетевой ввод / вывод

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

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