首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以非阻塞的方式执行一小时长的任务。[Python: Reddit PRAW]

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

Stack Overflow用户
提问于 2020-08-03 13:15:35
回答 2查看 91关注 0票数 1

我正在使用PRAW (Python包装器)为一个subreddit创建一个Reddit机器人,我对新提交的评论进行了调整,要求海报在他们的帖子上发表评论,以遵守发布规则。如果海报在1小时内没有在他们的帖子上发表评论,那么机器人应该删除该帖子。事件的顺序如下:

  1. 做了个职位。
  2. 机器人在帖子上发表评论,告诉海报他们有一个小时的时间在帖子上添加评论。
  3. 一个小时过去了。
  4. 如果用户没有评论他们的帖子,那么帖子就会被删除。否则,就不采取任何行动。

我的问题是等一个小时。我不能使用sleep()阻塞一个小时,因为机器人将需要处理在该时间框架内已经完成的其他帖子(即每十五分钟发送一次帖子,但使用sleep()一小时会导致机器人落后)。我也不认为我可以使用轮询,因为检查提交是阻塞线程。为了详细说明,我正在使用for submission in subreddit.stream.submissions(skip_existing=True):检查新提交的内容,其中subreddit.stream.submissions()是一个生成器/流,每当有人向subreddit (这里的文件)提交帖子时,它都会产生。

在这一点上,我完全不知道该去哪里。我需要为每个经过步骤1到4的帖子创建一个新任务,而不需要阻止每次提交帖子时都会执行更多相同的任务。如果你能提供一个指针,说明该往哪个方向走,或者我该如何做,我将不胜感激。万一你错过了,我就用Python了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-03 13:25:08

您可能需要使用'RQ‘(Redis任务队列)。它将在应用程序中添加一个新的依赖项,但您将得到所需的东西。您可以在这里参考文档

票数 2
EN

Stack Overflow用户

发布于 2020-08-03 13:48:46

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

代码语言:javascript
运行
复制
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秒。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63230159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档