簡體   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