[英]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.