Discord.py机器人一次只能处理一个事件?

时间:2020-09-12 08:45:59

标签: discord discord.py

我制作了一个基本的Internet抓取机器人(特别是可以读到好书并抓取有关所请求书籍的信息的机器人)。由于它必须进行一定程度的抓取(可能是因为我将其托管在笔记本电脑上),因此每个请求大约需要10秒钟。

我注意到,如果我彼此紧接着输入两个请求,则只有在完成第一个请求后,它才会执行第二个请求。我将如何使其并行运行?我读了一些有关分片的内容,但这似乎适用于多台服务器(也只能用于100台左右的服务器)。现在,它仅在一台服务器(我的测试服务器)上。

更新:根据一个答案,我可以使用aiohttp代替请求来做我想做的事情。我可以使用有关此代码的aiohttp的一些帮助:

sess = requests.session()
req = sess.get(i) #i is a url
soup = BeautifulSoup(req.content, 'html.parser')
link = soup.find('a')['href']
print(link)
with sess.get(link, stream=True) as req2:
    with open(os.path.join('C:\\save\\location', f"{file}.txt"), "wb") as x_file:
        shutil.copyfileobj(req2.raw, x_file)

file是较早初始化的变量。本质上,这里发生的是我正在将下载文件的内容写入所需目录中的文本文件。

1 个答案:

答案 0 :(得分:2)

问题是您使用requests,在异步函数中使用requests导致整个代码被阻塞,导致仅在第一个命令完成后才使用另一个命令。最好使用aiohttp而不是requests,因为它为HTTP请求提供了异步支持。

详细了解What blocking means? here

示例:

import aiohttp

URL = "https://www.reddit.com/r/aww/hot.json?limit=10"

async with aiohttp.request("GET", URL) as response:
    # Check if the request was vaild.
    if response.status == 200:
        # Converts response into dict.
        json_data = await response.json()

        # Gives you plain text.
        text_data = await response.text()

    else:
        print(f"The request was not successful\nStatus code: {response.status}")