Проблема Python с time.sleep в sleekxmpp - PullRequest
0 голосов
/ 28 сентября 2019

Я использую sleekxmpp в качестве клиента xmpp для python.Приходят запросы, которые я пересылаю другим пользователям / агентам.
Теперь сценарий использования: если пользователь недоступен, нам нужно проверять доступность каждые 10 секунд и передавать его, когда он доступен.Нам нужно отправить сообщение клиенту только 5 раз, но проверять доступность в течение длительного времени.

Я использую time.sleep (), если пользователь не доступен для повторной проверки в течение 10 секунд, но проблемаон блокирует весь поток, и на сервер не поступают новые запросы.

send_msg_counter = 0
check_status = False
while not check_status:
    check_status = requests.post(transfer_chat_url, data=data)
    if send_msg_counter < 5:
        send_msg("please wait", customer)
        send_msg_counter += 1
    time.sleep(10)

Ответы [ 2 ]

1 голос
/ 28 сентября 2019

Попробуйте реализовать

        delay = min(self.reconnect_delay * 2, self.reconnect_max_delay)
        delay = random.normalvariate(delay, delay * 0.1)
        log.debug('Waiting %s seconds before connecting.', delay)
        elapsed = 0
        try:
            while elapsed < delay and not self.stop.is_set():
                time.sleep(0.1)
                elapsed += 0.1
        except KeyboardInterrupt:
            self.set_stop()
            return False
        except SystemExit:
            self.set_stop()
            return False

Источник Ссылка

0 голосов
/ 28 сентября 2019

Это правда, что time.sleep(10) заблокирует ваш активный поток.На самом деле вы можете обнаружить, что использование Python 3 async / await - путь к успеху.К сожалению, у меня пока нет большого опыта работы с этими ключевыми словами, но другой путь может заключаться в реализации потоков Python.

https://docs.python.org/3/library/threading.html

Вот один из способов реализовать эту функцию.

import threading

def poll_counter(customer, transfer_chat_url, data, send_count=5, interval=10):
    send_msg_counter = 0
    check_status = False
    while not check_status:
        check_status = requests.post(transfer_chat_url, data=data)
        if send_msg_counter < send_count:
            send_msg("please wait", customer)
            send_msg_counter += 1
        time.sleep(interval)

    # If we're here, check status became true
    return None

... pre-existing code ...
threading.Thread(target=poll_counter, args=(customer, transfer_chat_url, data)).start()

... proceed to handle other tasks while the thread runs in the background.

Теперь я не буду вдаваться в подробности, но есть случаи, когда многопоточность является серьезной ошибкой.Это не должно быть одним из них, но вот хорошее прочтение для вас, чтобы понять эти варианты использования.https://realpython.com/python-gil/

Также, для получения более подробной информации об asyncio (async / await), вот хороший ресурс.https://docs.python.org/3/library/asyncio-task.html

...