【发布时间】: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