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