[英]Python, Function in Class that fires off every n seconds
我正在使用python 2.7.x,並且有一個類是使用JSON API的python庫。 要使用REST API允許的服務,一個人必須傳遞用戶名和密碼來生成令牌。 這些是短暫的令牌,持續時間為5-60秒。 我如何修改現有的類以創建每n秒運行一次以自動刷新令牌的函數?
示例類:
class MyClass(object):
_token = None
def __init__(self, username, password):
self._username = username
self.password = password
self._token = self.generate_token()
def generate_token(username, password):
# do some stuff to get token
self._token = "token value"
因此,在此示例中,我希望每10秒觸發一次generate_token。 這應確保所使用的令牌在對象MyClass的整個生命期內始終是新鮮的。
謝謝
您可以使用線程:
import time, threading
def generate_token(username, password):
# do some stuff to get token
self._token = "token value"
threading.Timer(60, generate_token(username, password)).start()
60通知,線程配置為每60秒運行一次。
我認為使用線程在循環中生成令牌的方法如下所示:
import time
import threading
class MyClass(object):
_token = None
def __init__(self, username, password):
self._username = username
self.password = password
self._token = self.generate_token()
self._thread = threading.Thread(target=self.token_loop)
self._thread.start()
def generate_token(username, password):
# do some stuff to get token
self._token = "token value"
def token_loop(self):
while True:
time.sleep(10)
self.generate_token()
如果您認為競爭條件可能是一個問題,則可能需要在生成和使用令牌周圍加一些鎖定(例如,嘗試使用令牌時重新生成令牌會導致令牌不一致或無效)。
盡管確實來自Lukas Graf的評論可能是一種更好的方法,但是請嘗試使用您當前的令牌進行請求,並在請求失敗時生成一個新令牌。
您可以在獲取令牌之前通過生成器,如果經過一定時間,則可以更新令牌:
import time
def token_generator(refresh_rate=10):
token = self.get_token(self.username, self.password)
t0 = time.clock()
while True:
if time.clock() - t0 <= refresh_rate:
token = self.get_token(self.username, self.password)
t0 = time.clock()
yield token
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.