GObject.timeout_add неожиданно прекращает работу
Я работаю над Ubuntu Appindicator, который отображает значение вызова JSON API каждые X секунд.
Проблема в том, что случайно он перестанет звонить self.loop
без каких-либо ошибок или предупреждений. Я могу запустить его в течение нескольких дней или часов. Я настроил (в разработке) операторы отладки, и он всегда останавливается после loop
функция называется.
Это как если бы я возвращался False
или не возвращаться из функции, даже если логика в этом коде должна всегда возвращать True
,
Вот документация для GObject.timeout_add
(для GTK2 но принцип стоит).
Я не уверен, зависит ли это от версии PyGTK. У меня такое было в Ubuntu 16.04 и Ubuntu 17.04.
Вот полный класс. Точка, где вызывается JSON API, находится в result = self.currency.query()
, Я рад дать дальнейшие отзывы.
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import GObject
class QueryLoop():
"""QueryLoop accepts the indicator to which the result will be written and an currency to obtain the results from.
To define an currency you only need to implement the query method and return the results in a pre-determined
format so that it will be consistent."""
def __init__(self, indicator, currency, timeout=5000):
"""
Initialize the query loop with the indicator and the currency to get the data from.
:param indicator: An instance of an indicator
:param currency: An instance of an currency to get the information from
:param timeout The interval between requests to the currency API
"""
self.indicator = indicator
self.currency = currency
self.timeout = timeout
self.last_known = {"last": "0.00"}
def loop(self):
"""Loop calls it-self forever and ever and will consult the currency for the most current value and update
the indicator's label content."""
result = self.currency.query()
if result is not None:
self.indicator.set_label("{} {}".format(result["last"], self.currency.get_ticker()))
self.last_known = result
else:
self.indicator.set_label("Last Known: {} EUR (Error)".format(self.last_known["last"]))
return True
def start(self):
"""Starts the query loop it does not do anything else. It's merely a matter of naming because
when initializing the loop in the main() point of entry."""
GObject.timeout_add(self.timeout, self.loop)
self.loop()