Я хочу, чтобы функция работала вечно, но я не хочу, чтобы она повторялась - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть поток запросов, и я хочу, чтобы поток работал вечно, но я не хочу, чтобы он повторялся. я хочу, чтобы функция обновлялась только тогда, когда в потоке появляется новая информация, если я пытаюсь запускать ее с интервалами, она повторяется, а старая информация продолжает добавляться в контейнер и повторяется до тех пор, пока я не закрою приложение.

Вот мой код, я был бы признателен за любые поправки к тому, как заставить контейнер обновлять только новую информацию.

    def processnotifications(self, dt):
        app = App.get_running_app()
        session = requests.Session()
        self.notif_stream = session.get("*********************************************************************" + app.displayname + "/.json", stream= True)
        print(self.notif_stream.json())
        if self.notif_stream.json() == None:
            return
        else:
            notifications = self.notif_stream.json()
            for key, value in notifications.items():
                self.notif = session.get("***************************************************" + app.displayname + "/" + key + "/" + "notification" + "/.json", stream = True)
                self.notificationslist.adapter.data.extend([self.notif.json()])

1 Ответ

0 голосов
/ 12 апреля 2020

Я не доволен этим решением - я делаю много предположений о данных и решил отслеживать элементы, которые меняются между вызовами метода. Это все еще может занять много времени и не очень дружелюбно к веб-сайту, если вызывать его слишком часто. Итак, скорее как соломенный человек, чем как ответ ...

Я предполагаю, что некоторая внешняя сущность периодически вызывает этот метод и интересуется, какие события изменились с момента последнего вызова. Они хранятся в виде набора ключей на объекте, который обновляется при каждом вызове.

# todo: add to __init__
#     # previous notifications and a set of changed keys since
#     # the last call to processnotifications
#     self.notfications = {}
#     self.notification_changes = set()    

def processnotifications(self, dt):
    base_url = "***************************"
    app = App.get_running_app()
    session = requests.Session()

    # assume no notification changes
    self.notification_changes = set()

    # todo: do you need to keep the session? best to drop those references if not needed
    # todo: you read the full json so no need to stream

    # get current notifications, if any
    notif_stream = session.get(f"{app.displayname}/.json")
    notifications = notif_stream.json()
    print(notifications)
    if notifications == None:
        return False

    # assuming notifications change every time there are subnotifications we could
    # check here.
    if notifications = self.notifications:
        return False

    # remember current notifications        
    self.notifications = notifications
    data = self.notificationslist.adapter.data

    # get each subnotification and track which ones have changed
    changes = set()

    # note: value unused.... so no need to iterate .items()
    for key in notifications:
        notif = session.get(f"{base_url}{app.displayname}/{key}/notification/.json").json()
        if notif:
            for subkey, value in notif:
                # update self.notificationslist.adapter.datad iff we
                # got a notification with a different value
                if data.get(subkey, "") != value:
                    data[subkey] = value
                    changes.add(subkey)

    # record the changes we saw
    self.notification_changes = changes
    return bool(changes)
...