【问题标题】:How can I prevent my bot to fall asleep/idiling on Heroku!?, Cronjob is not executing after bot starts polling?如何防止我的机器人在 Heroku 上睡着/闲置!?,机器人开始轮询后 Cron 作业没有执行?
【发布时间】:2021-05-11 01:14:45
【问题描述】:

希望你们一切顺利。 我在 Heroku 上部署了一个电报机器人,但机器人在 20-30 分钟后睡着了, 因为我使用的是 Heroku 的免费 dyno,所以我试图通过创建一个 cronjob 来防止这种情况发生 只在控制台中打印一些东西以保持机器人保持清醒。

正如您在下面看到的,我有2 functionsstart_pollingcronjob 但由于我先执行start_pollingcronjob 不会执行

我可以在这里使用什么技巧来防止我的机器人睡着!?

import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'telega.settings')
django.setup()

from main.bot import bot
from crontab import CronTab
from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler

def cronjob():
    """ Main cron job to prevent bot fall asleep. """
    print("Cron job is running, bot wont fall asleep")
    print("Tick! The time is: %s" % datetime.now())

def start_polling():
    """ Starts the bot """
    try:

        bot.skip_pending = True
        print(f'Bot {bot.get_me().username} started')
        bot.polling()
    except Exception as e:
        print(e)
        
# 1. Start polling
start_polling()

# 2. Start the scheduler ==> Prevent bot to fall asleep
scheduler = BlockingScheduler()
scheduler.add_job(cronjob, "interval", seconds=300)
scheduler.start()

【问题讨论】:

    标签: python heroku cron telegram-bot


    【解决方案1】:

    Web dyno 将在 30 分钟后进入休眠状态,而没有传入 HTTP 请求。您无法以任何方式阻止这种情况(即运行一些后台代码)。

    你有两个选择:

    • 通过执行来自外部计划的请求(每 x 分钟)保持其活动状态,例如 Kaffeine
    • 将 Dyno 转换为 worker。如果您不需要接收传入请求(例如您的 Bot 仅轮询),这是一个很好的解决方案:Dyno 不会休眠,您也不需要使用外部工具。

    【讨论】:

    • 项目分为两部分,Django 应用程序和机器人本身。 Django 应用程序使用web dyno,机器人使用worker dyno,所以对于 Django 应用程序来说,是的,它进入睡眠状态,但是一旦有人向它发送请求,它会在短暂延迟后再次唤醒。但至于第二个选项,虽然我的机器人在 worker dyno 上运行,但它仍然睡着了......
    • 这是因为您同时拥有webworker Dyno,如果Web dyno 处于非活动状态,它们都会进入睡眠状态。独奏worker Dyno 不睡觉。
    • 如果web dyno 处于非活动状态,那么单独的worker 将不会睡觉,对吧?所以如果我 ping 我的 Django/web dyno 就可以了?
    • 在我的回答选项#1 中建议对 Web Dyno 进行 ping 操作,使其保持正常运行(问题已解决)。如果您的 Proc 文件只有一名工作人员(这不会休眠),则选项 #2 有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2018-02-22
    • 1970-01-01
    • 2012-12-28
    • 2021-10-23
    • 2014-04-07
    • 2018-07-30
    相关资源
    最近更新 更多