【问题标题】:asyncio aiohttp errors when threading线程处理时出现异步 aiohttp 错误
【发布时间】:2019-01-26 01:31:57
【问题描述】:

我有一个为我编写的脚本,但我无法执行它...我收到以下错误...

Traceback(最近一次调用最后一次):

文件“crawler.py”,第 56 行,在 loop.run_until_complete(future) 文件“C:\Users\lisa\AppData\Local\Programs\Python\Python37-32\lib\asyncio\base_events.py”, 第 568 行,在 run_until_complete 在运行中返回 future.result() 文件“crawler.py”,第 51 行 等待响应文件“crawler.py”,第 32 行,在 bound_fetch 中 await fetch(url, session) 文件“crawler.py”,第 22 行,在 fetch 与 session.get(url, headers=headers) 异步作为响应:文件“C:\Users\lisa\AppData\Local\Programs\Python\Python37-32\lib\site-packages\aiohttp\client.py”, 第 843 行,在 aenter 中 self._resp = 等待 self._coro 文件 "C:\Users\lisa\AppData\Local\Programs\Python\Python37-32\lib\site-packages\aiohttp\client.py", 第 387 行,在 _request 中 等待 resp.start(conn) 文件“C:\Users\lisa\AppData\Local\Programs\Python\Python37-32\lib\site-packages\aiohttp\client_reqrep.py”, 第 748 行,开始 消息,有效负载 = 等待 self._protocol.read() 文件“C:\Users\lisa\AppData\Local\Programs\Python\Python37-32\lib\site-packages\aiohttp\streams.py”, 第 533 行,已读 等待 self._waiter aiohttp.client_exceptions.ServerDisconnectedError: None

我有什么明显的遗漏吗?我可以在没有线程的情况下运行相同的脚本,谢谢...

import random
import asyncio
from aiohttp import ClientSession
import requests
from itertools import product
from string import *
from multiprocessing import Pool
from itertools import islice
import sys


headers = {'User-Agent': 'Mozilla/5.0'}

letter = sys.argv[1]
number = int(sys.argv[2])

first_group = product(ascii_lowercase, repeat=2)
second_group = product(digits, repeat=3)
codeList = [''.join([''.join(k) for k in prod]) for prod in product([letter], first_group, second_group)]

async def fetch(url, session):
    async with session.get(url, headers=headers) as response:
        statusCode = response.status
        if(statusCode == 200):
            print("{} statusCode is {}".format(url, statusCode))
        return await response.read()


async def bound_fetch(sem, url, session):
    async with sem:
        await fetch(url, session)

def getUrl(codeIdex):
    return "https://www.blahblah.com/" + codeList[codeIdex] + ".png"

async def run(r):
    tasks = []
    sem = asyncio.Semaphore(1000)

    async with ClientSession() as session:
        for i in range(r):
            task = asyncio.ensure_future(bound_fetch(sem, getUrl(i), session))
            tasks.append(task)

        responses = asyncio.gather(*tasks)
        await responses

loop = asyncio.get_event_loop()

future = asyncio.ensure_future(run(number))
loop.run_until_complete(future)

【问题讨论】:

  • 您能否将代码缩减为最小示例,但仍能重现问题,最好使用我们可以测试的公开网站?如图所示,您的代码甚至具有它甚至不使用的导入,例如 multiprocessing.Pool

标签: python multithreading python-asyncio


【解决方案1】:

我不能离开 cmets 所以我会写在这里。尝试为信号量限制设置一个较低的数字,我认为问题在于您同时向网站发出多少请求。如果您想最终获得所有请求的响应,您还需要在尝试获取任何 url 时捕获此类错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    相关资源
    最近更新 更多