Я пытаюсь использовать чудо-апшедулер в пирамидальном API.Идея состоит в том, чтобы фоновое задание запускалось регулярно, в то время как мы все еще время от времени запрашиваем API.В основном я использую работу в классе как:
def my_class(object):
def __init__(self):
self.current_result = 0
scheduler = BackGroundScheduler()
scheduler.start()
scheduler.add_job(my_job,"interval", id="foo", seconds=5)
def my_job():
print("i'm updating result")
self.current_result += 1
И вне этого класса (для меня услуга) API имеет конечную точку POST, которая возвращает текущий результат экземпляра my_class:
class MyApi(object):
def __init__(self):
self.my_class = MyClass()
@view_config(request_method='POST')
def my_post(self):
return self.my_class.current_result
Когда все работает, я вижу отпечатки и приращение значения внутри службы.Но current_result остается как 0 при получении из поста.Из того, что я знаю о потоке, я предполагаю, что обновление, которое я делаю, не на том же объекте my_class , но должно быть на копии, переданной потоку.Одним из решений, которое я вижу, будет обновление переменной в общем промежуточном файле (запись на диск или в базу данных).Но мне было интересно, можно ли это сделать в памяти.
Мне удается делать именно это, когда я делаю это обычным скриптом или с одним скриптом и очень простым API-интерфейсом FLASK (нет класса для API).там), но я не могу иметь эту логическую функцию внутри API пирамиды.
Она должна быть связана с какой-то внутренней частью Пирамиды, порождающей мою конечную точку API в другом потоке, но я не могу получить права напроблема.
Спасибо!
=== РЕДАКТИРОВАТЬ ===
Я пытался решить эту проблему несколькими способами.Во-первых, используемый экземпляр MyClass инициализируется в другом скрипте, следуя шаблону контейнера.Этот контейнер по умолчанию содержится во всех экземплярах пирамиды MyApi и должен содержать все глобальные переменные, связанные с моим проектом.Я также определяю глобальный экземпляр MyClass просто для уверенности и печатаю его текущее значение результата для сравнения
global_my_class = MyClass()
class MyApi(object):
def __init__(self):
pass
@view_config(request_method='POST')
def my_post(self):
print(global_my_class.current_result)
return self.container.my_class.current_result
Я проверяю с помощью отладки, что MyClass порождается только дважды во время выполнения API (один для глобальной переменной)один внутри контейнера. Однако в журнале я вижу два значения current_result с приращением, но при каждом вызове my_post я получаю только 0 с.