python - 即使函数正在循环,也让机器人保持活力
问题描述
我正在开发一个不和谐的 covid 跟踪器机器人,信息是从 facebook 页面上抓取的。我成功地抓取了信息并将其存储到列表中,但是当我运行机器人时,机器人将首先工作,但每 5 分钟机器人将断开连接并且没有响应,因为每 5 分钟def scrape
刷新一次。所以我的问题是,即使抓取功能正在循环,我如何才能让机器人继续工作?
我的代码:
import discord
import random
import time
import asyncio
from facebook_scraper import get_posts
from discord.ext import commands, tasks
listposts = []
token = 'xxxx'
client = discord.Client()
listposts = []
@tasks.loop(minutes=5)
async def scrape():
wanted = "Pecahan setiap negeri (Kumulatif)" # wanted post
for post in get_posts("myhealthkkm", pages=5):
if post.get("text") is not None and wanted in post.get("text"):
# print("Found", t)
listposts.append(post.get("text"))
else:
pass
# print("Not found")
print(listposts)
@client.event
async def on_message(message):
if message.content.startswith("-malaysiacase"):
await message.channel.send(listposts)
@client.event
async def on_ready():
print("RUN")
scrape.start()
client.run(token)
解决方案
facebook_scraper 模块不是异步的,因此会阻塞,这将使您的机器人冻结直到它完成并错过导致断开连接的心跳。
不要在不和谐的机器人中使用时间模块,因为同样的原因你必须使用 asyncio.sleep。
您可以做的一些替代方案是:将 BS4 与 AIOHTTP 结合使用。或者查看在 loop.run_in_executor 中运行同步函数。
这里有一些例子:Python lib 美丽的汤使用aiohttp
推荐阅读
- python - 针对这种情况做 URL 调度程序的最佳方法是什么?
- docker - 在 docker-entrypoint.sh 文件中的后台运行 cron 作业
- spring - 无法实例化 Bean:工厂方法“springSecurityFilterChain”抛出 NullPointerException
- javascript - Onclick 在 Firefox 或 Safari 中不起作用
- php - 如何使用 php 从此 Irfame 中检索 data-uploadid
- r - 如何旋转 tibble?
- angular - 无法在 kubernetes 上运行 Angular 应用程序
- bash - “bash -c 命令参数”末尾的参数的目的是什么?
- php - base_url() 函数不起作用(代码点火器)
- firebase - 尝试使用 NextJS 上的 getStaticProps 从 Firebase 获取数据时出现错误 XMLHttpRequest is not defined