【问题标题】:Persistent List Python Implementation持久列表 Python 实现
【发布时间】:2017-01-17 08:01:57
【问题描述】:

我有将日志发送到公开 API 的类。现在我想要发生的是将失败的日志保存/保留在列表中,以便可以再次将其重新发送到服务器。

这是我目前所拥有的。 您可能会注意到我已经声明了一个类变量,并且我有read 这并不是真正可取的。

我担心的是,有没有更好的方法来持久化列表或队列?

from collections import *
import time
import threading
import requests
import json


URL_POST = "http:/some/url/here"

class LogManager:
    listQueue = deque()

    def post(self, log):
        headers = {"Content-type": "application/json",
               "Accept": "text/plain", "User-Agent": "Test user agent"}
        resp = requests.post(URL_POST, data=json.dumps(log), headers=headers)
        return resp.status_code

    def send_log(self, log):
        try:
            print ("Sending log to backend")
            self.post(log)
        except: # sending to server fails for some reason
            print ("Sending logs to server fail, appending to Queue")
            LogManager.listQueue.append(log)

    def resend_log(self, log):
        print ("checking if deque has values")

        if LogManager.listQueue:
            logToPost = LogManager.listQueue.popleft()
            try:
                self.post(logToPost)
                print ("resending failed logs")
            except: #for some reason it fails again
                LogManager.listQueue.appendleft(logToPost)
                print ("appending log back to deque")

    def run(self,log):
        t1 = threading.Thread(target=self.send_log, args=(log,))
        t2 = threading.Thread(target=self.resend_log,args=(log,))
        t1.start()
        time.sleep(2)
        t2.start()
        t1.join()
        t2.join()

if __name__ == "__main__":
    while True:
        logs =  LogManager()
        logs.run({"some log": "test logs"})

【问题讨论】:

    标签: python list python-3.x queue


    【解决方案1】:

    由于 LogManager 存储的唯一变量是持久变量,因此似乎不需要每次都重新实例化该类。我可能会将logs = LogManager() 行移到while 循环之外,并将list_queue 更改为在类的__init__ 方法中创建的实例变量self.list_queue。这样一来,您将拥有一个带有一个队列的 LogManager,每个循环只调用其 run 方法。

    也就是说,如果您将其保留在循环中,因为您的类将具有更多功能,每个循环都需要一个新实例,那么使用类变量来跟踪实例之间的列表正是类变量的用途。他们一点也不可取。您链接到的文档中给出的示例很糟糕,因为他们使用类变量来存储应该是特定于实例的数据。

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 2013-10-24
      • 2011-06-19
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 2017-07-22
      • 1970-01-01
      相关资源
      最近更新 更多