【问题标题】:Python, Use threading and schedule to keep running a function constantlyPython,使用线程和调度来不断运行一个函数
【发布时间】:2021-08-29 00:49:17
【问题描述】:

我正在制作一个使用 instabot 自动发布到 Instagram 的机器人,现在的问题是,如果我超过请求次数,机器人会在重试几分钟后终止脚本。

我想出的解决办法是安排脚本每隔一小时左右运行一次,为了保证脚本持续运行,我使用线程在线程死掉的时候重新启动发布功能。

负责发布的函数,在此代码中,如果来自instabot 的机器人实例重试发送请求几分钟但失败,它将终止整个脚本。

def main():
    create_db()
    try:
        os.mkdir("images")
        print("[INFO] Images Directory Created")
    except:
        print("[INFO] Images Directory Found")
    # GET A SUBMISSION FROM HOT
    submissions = list(reddit.subreddit('memes').hot(limit=100))
    for sub in submissions:
        print("*"*68)
        url = sub.url
        print(f'[INFO] URL : {url}')
        if "jpg" in url or "png" in url:
            if not sub.stickied:
                print("[INFO] Valid Post")
                if check_if_exist(sub.id) is None:
                    id_ = sub.id
                    name = sub.title
                    link = sub.url
                    status = "FALSE"
                    print(f"""
                                [INFO] ID = {id_}
                                [INFO] NAME = {name}
                                [INFO] LINK = {link}
                                [INFO] STATUS = {status}
                                """)
                    # SAVE THE SUBMISSION TO THE DATABASE
                    insert_db(id_, name, link, status)
                    post_instagram(id_)
                    print(f"[INFO] Picture Uploaded, Next Upload is Scheduled in 60 min")
                    break
    time.sleep(5 * 60)

调度函数:

def func_start():
    schedule.every(1).hour.do(main)
    while True:
        schedule.run_pending()
        time.sleep(10 * 60)

最后一段代码:

if __name__ == '__main__':
    t = threading.Thread(target=func_start)
    while True:
        if not t.is_alive():
            t.start()
        else:
            pass

所以基本上我想每隔一小时左右继续运行主要功能,但我没有任何成功。

【问题讨论】:

    标签: python instagram python-multithreading schedule


    【解决方案1】:

    在我看来 schedulethreading 对于您的用例来说太过分了,因为您的脚本只执行一个任务,因此您不需要并发并且可以在主线程中运行整个事情。您主要只需要从main 函数中捕获异常。我会选择这样的:

    if __name__ == '__main__':
        while True:
            try:
                main()
            except Exception as e:
                # will handle exceptions from `main` so they do not
                #   terminate the script
                # note that it would be better to only catch the exact
                #   exception you know you want to ignore (rather than
                #   the very broad `Exception`), and let other ones
                #   terminate the script
                print("Exception:", e)
            finally:
                # will sleep 10 minutes regardless whether the last
                #   `main` run succeeded or not, then continue running
                #   the infinite loop
                time.sleep(10 * 60)
    

    ...除非您真的希望每个 main 运行以 60 分钟的间隔精确开始,在这种情况下,您可能需要 threadingschedule。因为,如果运行 main 需要 3 到 5 分钟,那么在每次执行后简单地休眠 60 分钟意味着您将每 63 到 65 分钟启动一次函数。

    【讨论】:

      猜你喜欢
      • 2019-12-26
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      • 2021-05-13
      • 1970-01-01
      • 2022-12-01
      • 2023-01-08
      相关资源
      最近更新 更多