【问题标题】:APscheduler and Pyramid pythonAPscheduler 和 Pyramid python
【发布时间】:2019-05-03 22:19:39
【问题描述】:

我正在尝试在 pyarmid api 中使用 Wonder apscheduler。我们的想法是让后台作业定期运行,而我们仍然不时向 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 上,而是必须在传递给线程的副本上。 我看到的一种解决方案是更新共享中间体中的变量(写入磁盘或数据库)。但我想知道这是否可以在内存中完成。

当我在常规脚本中执行此操作时,或者使用一个脚本和一个非常简单的 FLASK api(那里没有 API 类)时,我设法做到了这一点,但我无法设法在金字塔内拥有这个逻辑函数接口。

它必须链接到 Pyramid 的某些内部,在不同的线程上生成我的 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。

【问题讨论】:

    标签: python-3.x oop pyramid python-multithreading apscheduler


    【解决方案1】:

    视图类的实例仅在请求期间存在 - 请求进入,视图类被创建,产生结果并被释放。因此,您的每个视图实例都会获得一个新的 MyClass() 副本,该副本与之前的请求是分开的。

    作为一个非常简单的解决方案,您可以尝试定义一个将在进程范围内共享的全局实例:

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

    【讨论】:

    • 非常感谢!我编辑了这个问题。我已经尝试过了,事实上,默认情况下,我不会在 MyApi 的每次初始化时实例化 myClass。我怀疑原因在于处理问题。仅仅为了这个而继续使用 Flask 真是令人沮丧:)
    猜你喜欢
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    相关资源
    最近更新 更多