簡體   English   中英

Python 在 slimxmpp 中的 time.sleep 問題

[英]Python issue with time.sleep in sleekxmpp

我正在使用 slimxmpp 作為 python 的 xmpp 客戶端。 請求即將到來,我將進一步轉發給其他用戶/代理。
現在的用例是,如果用戶不可用,我們需要每 10 秒檢查一次可用性,並在他可用時轉移給他。 我們只需要向客戶發送 5 次消息,但要長時間檢查可用性。

如果用戶無法在 10 秒內再次檢查,我正在使用 time.sleep(),但問題是它阻塞了整個線程並且沒有新請求到達服務器。

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)

time.sleep(10)確實會阻塞您的活動線程。 您實際上可能會發現使用 Python 3 的 async/await 是通往 go 的方式。 遺憾的是,我對這些關鍵字還沒有太多經驗,但另一條路線可能是實現 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.

現在,我不會詳細介紹 go,但在某些用例中,線程是一個重大錯誤。 這不應該是其中之一,但這是一本很好的讀物,可讓您了解這些用例。 https://realpython.com/python-gil/

此外,有關 asyncio (async/await) 的更多詳細信息,這里是一個很好的資源。 https://docs.python.org/3/library/asyncio-task.html

嘗試實施

        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

來源鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM