繁体   English   中英

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM