Выполнение часовых задач без блокировки. [Python: Reddit PRAW] - PullRequest
1 голос
/ 03 августа 2020

Я создаю бота Reddit, используя PRAW (Python Reddit API Wrapper) для субреддита. Я модерирую эти комментарии к новым материалам с просьбой, чтобы автор комментировал свое сообщение, чтобы соответствовать правилам публикации. Если автор не прокомментировал свое сообщение в течение 1 часа, бот должен удалить сообщение. Последовательность событий выглядит следующим образом:

  1. Сообщение создано.
  2. Бот комментирует сообщение, сообщая, что у него есть один час, чтобы добавить комментарий к сообщению.
  3. Проходит час.
  4. Если пользователь не прокомментировал свое сообщение, сообщение удаляется. В противном случае никаких действий не предпринимается.

У меня проблема с ожиданием в течение одного часа. Я не могу использовать sleep() для блокировки на один час, потому что боту нужно будет обрабатывать другие сообщения, которые были сделаны в этот период времени (т.е. сообщения делаются каждые пятнадцать минут, но использование sleep() в течение одного часа приведет к падению бота позади). Я также не думаю, что могу использовать опрос, поскольку проверка отправлений блокирует поток. Чтобы уточнить, я проверяю наличие новых представлений, используя for submission in subreddit.stream.submissions(skip_existing=True):, где subreddit.stream.submissions() - это генератор / поток, который генерируется всякий раз, когда кто-то отправляет сообщение в сабреддит ( Документация здесь ).

Итак на данный момент я совершенно не понимаю, где находится go. Мне нужно создать новую задачу для каждого создаваемого сообщения, которое проходит через шаги с 1 по 4, не блокируя больше идентичных задач, выполняемых каждый раз при отправке сообщения. Если бы вы могли указать направление на go или как я могу это сделать, я был бы благодарен. Если вы его пропустили, я использую Python.

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Возможно, вы захотите использовать «RQ» (Redis Task Queue). Это добавит новую зависимость в ваше приложение, но вы получите то, что хотите. Вы можете обратиться к Документам здесь.

1 голос
/ 03 августа 2020

Для меня эта задача выглядит как задание на 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 C, Doing B, Doing A с интервалом 10 секунд между каждым действием.

...