Python,类中的函数,每隔n秒触发一次

时间:2014-03-17 16:48:51

标签: python class

我使用的是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的生命周期内使用的令牌总是新鲜的。

谢谢

3 个答案:

答案 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