【问题标题】:Computer hangs on large number of Python async aiohttp requests计算机因大量 Python 异步 aiohttp 请求而挂起
【发布时间】:2018-07-17 23:51:27
【问题描述】:

我有一个包含超过 2000 万行的文本文件,格式如下:

ABC123456|fname1 lname1|fname2 lname2
.
.
.
.

我的任务是逐行读取文件并将两个名称发送到 Google 音译 API 并在终端 (linux) 上打印结果。以下是我的代码:

import asyncio
import urllib.parse
from aiohttp import ClientSession

async def getResponse(url):
    async with ClientSession() as session:
        async with session.get(url) as response:
            response = await response.read()
            print(response)

loop = asyncio.get_event_loop()

tasks = []
# I'm using test server localhost, but you can use any url
url = "https://www.google.com/inputtools/request?{}"

for line in open('tg.txt'):
    vdata = line.split("|")

    if len(vdata) == 3:
        names = vdata[1]+"_"+vdata[2]
        tdata = {"text":names,"ime":"transliteration_en_te"}
        qstring = urllib.parse.urlencode(tdata)
        task = asyncio.ensure_future(getResponse(url.format(qstring)))
        tasks.append(task)

loop.run_until_complete(asyncio.wait(tasks))

在上面的代码中,我的文件tg.txt 包含 20+ 百万行。当我运行它时,我的笔记本电脑死机了,我必须硬重启它。但是当我使用另一个只有 10 行的文件 tg1.txt 时,这段代码可以正常工作。我错过了什么?

【问题讨论】:

    标签: python async-await aiohttp


    【解决方案1】:

    您可以尝试使用asyncio.gather(*futures) 而不是asyncio.wait。 还尝试使用固定大小的批次(例如每批次 10 行)执行此操作,并在每个处理的批次之后添加打印,它应该可以帮助您调试您的应用程序。 此外,您的未来可能会以不同的顺序完成,最好存储收集结果并在批处理完成时打印。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      相关资源
      最近更新 更多