计算机挂起大量Python异步aiohttp请求

时间:2018-07-12 21:12:17

标签: python async-await aiohttp

我有一个超过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时,此代码可以正常工作。我想念什么?

1 个答案:

答案 0 :(得分:1)

您可以尝试使用<Snake>: size_hint: None, None size: 15, 15 canvas: Color: rgba: 1, 0, 0, 1 Rectangle: pos: self.pos size: self.size on_touch_down: self.move() 代替asyncio.gather(*futures)。 另外,请尝试使用固定大小的批次(例如,每批次10行)执行此操作,并在每个已处理的批次之后添加打印,这应该有助于您调试应用。 另外,您的未来可能会以不同的顺序完成,最好在完成批处理后存储收集的结果并打印出来。