为啥我的 tasks.loop 在 Heroku 上不起作用?

Posted

技术标签:

【中文标题】为啥我的 tasks.loop 在 Heroku 上不起作用?【英文标题】:Why is my tasks.loop not working on Heroku?为什么我的 tasks.loop 在 Heroku 上不起作用? 【发布时间】:2021-05-31 16:40:46 【问题描述】:

我有一个名为wednesday 的齿轮,它从images 文件夹中打印特定图像,顾名思义,每周三。然而,出于测试目的,我让循环每 30 秒运行一次,并且我已经让它在今天(星期一)而不是星期三运行。我已经尝试在我的计算机上本地运行此代码,并且它没有问题。但是,在部署到 Heroku 之后,循环根本不起作用。请记住,我还有另一个 cog 也有 tasks.loop,它每隔几秒就会改变我的机器人的状态。然而,这个齿轮在 Heroku 上没有任何问题。正如我之前所说,这个 wednesday cog 在我的机器上本地工作,这意味着我正在为我的机器人正确添加和加载 cog,并执行代码运行所需的其他操作。那么,为什么我的代码不能在 Heroku 上运行?

import discord, datetime
from discord.ext import commands, tasks
import json

with open('config.json') as f:
    config = json.load(f)

class wednesday(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
    
    @tasks.loop(seconds=30)
    async def time_checker(self):
        self.time = datetime.datetime.now
        if self.time().hour == 19:
            if datetime.datetime.today().weekday() == 0: # 0 because I'm testing today which is a Monday
                self.channel = await self.bot.fetch_channel(config['id'])
                await self.channel.send(file=discord.File('images/wednesday_pic.png'))
    
    @commands.Cog.listener()
    async def on_ready(self):
        await self.bot.wait_until_ready()
        self.time_checker.start()

def setup(bot):
    bot.add_cog(wednesday(bot))

我不确定为什么会这样:我认为这可能与循环有关。我在images 文件夹中有其他图像,它们可以很好地用于我拥有的其他命令,因为当我调用命令时机器人会发送它们。任何帮助将不胜感激。

【问题讨论】:

请详细说明您的问题,而不是仅仅说“这不起作用”。提供完整的追溯或错误报告,否则我们将无法提供帮助。 嗯,就是这样:没有错误。 打开图片有用吗?在heroku 图像以及所有其他文件都是从我的 GitHub 存储库部署的,因为我更改了 Heroku 上的设置,每次推送到我的存储库时都会重新部署。所以,如果我检查我的 git 存储库,我可以看到我的图像。 尝试打开文件或打印调试,你需要弄清楚代码哪里出错了,你的命令没有被执行,或者你的错误处理程序吃掉了错误或者图像没有加载. 【参考方案1】:

我们需要更多调试细节。调试的时候你可能会发现错误是什么。

    检查requirements.txt 并确保版本已锁定。 (如果您通过 pip freeze 生成它,则可能是这种情况。如果不是:请确保您本地开发环境中的版本与 Heroku 上的版本相同。 添加更多日志。加载您的 cog 时记录。当您的任务与变量的值一起重复执行时记录。打印当前工作目录的日志 (import os; print(os.getcwd())) 检查您的机器人可以到达多远。是不是一开始就失败了,没有上线?齿轮没有加载吗?是日常任务吗?是路径分辨率吗? 提供日志。不要切断原木。提供整个事情。它们可能看起来与您无关,但其他读者可能会发现一些东西。 您在此处提供了图像的相对路径。提供项目文件夹结构的信息。用于执行项目的命令是什么(Procfile,也可以在日志中看到。)

【讨论】:

【参考方案2】:

我已经找出导致错误的原因。 Heroku 服务器在 UTC 时区运行,而我在 PST/PDT 时区。因此,我使用 UTC 到 PDT converter 来获取我正在寻找循环以打印出图像的适当时间。这是最终代码:

import discord, datetime
from discord.ext import commands, tasks
import json

with open('config.json') as f:
    config = json.load(f)

class wednesday(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
    
    @tasks.loop(hours=1)
    async def time_checker(self):
        self.channel = await self.bot.fetch_channel(config['channel'])
        self.time = datetime.datetime.now
        if self.time().hour == 12:
            if datetime.datetime.today().weekday() == 3:
                await self.channel.send(file=discord.File('images/wednesday_pic.png'))
    
    @commands.Cog.listener()
    async def on_ready(self):
        await self.bot.wait_until_ready()
        self.time_checker.start()

def setup(bot):
    bot.add_cog(wednesday(bot))

【讨论】:

以上是关于为啥我的 tasks.loop 在 Heroku 上不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

我的 Heroku 构建一直失败,我不知道为啥

为啥我的应用无法在 Heroku 上建立 websocket 连接?

为啥我的 Django 应用程序可以在本地运行,但不能在 Heroku 上运行?

为啥 heroku 不能在我的反应应用程序中使用代理?

为啥我的 socket.io 视频聊天无法在 heroku 上运行?

为啥我的 Flask 应用程序在 Heroku 上被检测为 node.js