Как отправлять сообщение получателю каждые x минут с помощью python-xmpp (и gtalk)?

def message_received(connect_object, message_node):
    // if x event happens:
    exit()

jid = xmpp.JID(user)
connection = xmpp.Client(jid.getDomain(), debug=[])
connection.connect(server)
result = connection.auth(jid.getNode(), password, "qwerty")

connection.RegisterHandler('message', message_received)
connection.sendInitPresence()

while connection.Process(1):
    pass

Независимо от того, что делает приведенный выше код, я хочу отправлять сообщение получателю каждый час в качестве напоминания о чем-то. Даже если сообщение получено и управление переходит к функции message_received, сообщение, которое будет отправляться каждый час, должно продолжаться, если только не было обнаружено exit().

Куда вставить сообщение? Я хочу использовать time.sleep(), но допустимо и любое другое решение.


person aste123    schedule 10.02.2015    source источник
comment
На данный момент я использовал модуль datetime и использовал его внутри цикла while в конце. Он работает нормально.   -  person aste123    schedule 10.02.2015


Ответы (1)


Если вы не против использовать для этого другую утилиту, я бы предпочел использовать другой инструмент (например, cron/anacron для *nixes) для запуска короткого скрипта, который быстро завершает работу и отправляет сообщение.

Этот метод имеет некоторые преимущества:

  • Позволяет игнорировать время выполнения. Если вы используете time.sleep(), чтобы предотвратить дрейф, когда ваши сообщения отправляются (скажем, сервер XMPP не работает в течение дня, и этот 60-секундный или любой другой тайм-аут в сумме составляет 24 минуты, ваши сообщения начнут отправляться ближе к нижней части часа, чем к верхней), вам действительно следует рассчитать время выполнения, а затем вычесть это из времени сна. Это усложняет код, что требует дополнительной отладки.
  • Позволяет не беспокоиться о сохранении процесса. Если ваш скрипт ложно выдаст сетевую ошибку и выйдет из строя, он автоматически запустится снова через час.
  • Использует проверенный временем и зарекомендовавший себя в боях механизм запуска заданий, когда вы хотите, чтобы они выполнялись.

Изменить: я пропустил необходимость останавливаться на команде «выход». Если вы используете crontab, вы можете использовать python-crontab для автоматической вставки/удаления записи crontab для этого задания.

person bmhkim    schedule 10.02.2015