以非阻塞方式执行长达一小时的任务。 [Python:Reddit PRAW]

Doing hour long tasks in a non-blocking way. [Python: Reddit PRAW]

我正在使用 PRAW(Python Reddit API Wrapper)为一个 subreddit 创建一个 Reddit 机器人 我调节对新提交的评论,要求 poster 对他们的评论post 以遵守 posting 规则。如果 post 用户在 1 小时内没有对他们的 post 发表评论,那么机器人应该删除 post。事件顺序如下所示:

  1. 制作了post
  2. 机器人在 post 上发表评论,告诉 post 用户他们有一个小时的时间在 post 上添加评论。
  3. 一个小时过去了。
  4. 如果用户没有对他们的 post 发表评论,那么 post 将被删除。否则,不采取任何行动。

我遇到的问题是等了一个小时。我不能使用 sleep() 来阻止一个小时,因为机器人将需要处理在那个时间范围内制作的其他 posts(即 posts 每十五分钟制作一次,但使用sleep() 一小时会导致机器人落后)。我也不认为我可以使用轮询,因为检查提交会阻塞线程。详细地说,我正在使用 for submission in subreddit.stream.submissions(skip_existing=True): 检查新提交,其中 subreddit.stream.submissions() 是一个生成器/流,每当有人向 subreddit (Documentation here) 提交 post 时就会生成。

所以在这一点上,我完全不知道该去哪里。我需要为通过步骤 1 到 4 运行的每个 post 创建一个新任务,而不会在提交 post 时阻止更多相同的任务。如果您能提供有关前进方向或如何执行此操作的指示,我将不胜感激。如果你错过了,我正在使用 Python.

您可能想使用 'RQ'(Redis 任务队列)。它会在您的应用程序中添加一个新的依赖项,但您会得到您想要的。可以参考这里的Docs

对我来说,这个任务看起来像是 threading.Timer 的工作。用法示例

import threading
def do_action(x):
    print(f'Doing {x}')
t1 = threading.Timer(30.0, do_action, ['A'])
t1.start()
t2 = threading.Timer(20.0, do_action, ['B'])
t2.start()
t3 = threading.Timer(10.0, do_action, ['C'])
t3.start()

将打印 Doing CDoing BDoing A,每个操作之间间隔 10 秒。