我使用的是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"
所以在这个例子中,我希望generate_token每10秒被触发一次。这应该确保在对象MyClass的生命周期内使用的令牌总是新鲜的。
谢谢
答案 0 :(得分:1)
您可以使用线程:
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秒运行一次。
答案 1 :(得分:0)
我认为类似下面的内容应该可行,使用线程在循环中生成令牌:
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的评论确实是一种更好的方法,但请尝试使用当前令牌进行请求,并在请求失败时生成新请求。
答案 2 :(得分:0)
您可以在获取令牌之前通过生成器,并在经过一段时间后更新令牌:
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