APscheduler и Pyramid python - PullRequest
       12

APscheduler и Pyramid python

0 голосов
/ 02 декабря 2018

Я пытаюсь использовать чудо-апшедулер в пирамидальном 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 с.

1 Ответ

0 голосов
/ 05 декабря 2018

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

В качестве очень простого решения вы можете попытаться определить глобальный экземпляр, который будет общим для всего процесса:

my_class = MyClass()

class MyApi(object):

    @view_config(request_method='POST')
    def my_post(self):
       return my_class.current_result
...