gpt4 book ai didi

python - 使用后台线程定期刷新字段的值

转载 作者:行者123 更新时间:2023-12-01 07:33:17 24 4
gpt4 key购买 nike

首先,标题并不是 100% 准确,因为我并不介意解决方案是否包含线程。

在我的 django 项目中,我有一个包含一些字段的模型。其中一个字段由函数计算。所以在我的 models.py 中,它看起来像这样:

class Feed(models.Model):

name = models.ForeignKey(Name, on_delete=models.CASCADE, default=0)
source = models.ForeignKey(Source, on_delete=models.CASCADE, default=0)

def set_status(self, _status=None):
# code that i have to implement
if status is None:
return 'ACTIVE'
else:
return _status
status = property(set_status)

我想做的是能够定期重新设置状态字段的值,然后刷新页面,以便用户获得更新的状态。我的主要想法是以某种方式调用一个后台线程,它将等待套接字消息,例如:

def wait_for_status_change(self):
#setting the socket
while True:
# socket wait to receive and edit the message accordingly
self.set_status(socket_message)

显然,我必须指定要在该模型的哪个特定对象中更改状态字段。我尝试使用 Celery ,但我认为它太复杂了,所以我不想用它来解决这个问题。

我还想到了一个带有调度程序的解决方案,但我并不真正理解如何在这种情况下使用它。

我知道有些事情我误解了,也许我没有以正确的方式思考,所以我很感激任何方向的建议。

编辑:我尝试使用 Django-q 调度程序,但无法使其工作。在文档中提到:

You can manage them through the Admin pages or directly from your code .

所以我在我的admin.py中添加了这段代码:

    if schedule('Feed.set_status', 'not active', schedule_type='I', minutes=1, repeats=-1, next_run=datetime.now()):
print('SCHEDULED')

并在我的函数中添加了一些 print() ,以便我可以检查它是否确实被调用。当我运行服务器时,我收到“预定”消息,但它似乎并没有真正再次调用该函数。

最佳答案

Celery 对于这项任务来说确实很大,但无论如何我都会选择一个库。我会尝试使用 django-q 。它有schedulers并且可以在没有外部依赖的情况下使用它(使用 Django ORM 作为消息代理,而不是 Redis 等其他工具)。它还有其他优点,例如我们可以在 Django 管理中看到任务。

该文档提到了安排 Django 管理命令的可能性。因此,这实际上可能是另一种可能性:您编写一个管理命令来更新您的字段,然后使用一次性系统命令或在 python 中使用 cron library 设置 cron 作业。 (我没有偏好)。

django-q 调度程序很容易设置,如下所示:

from django_q.models import Schedule

Schedule.objects.create(func='math.copysign',
hook='hooks.print_result',
args='2,-2',
schedule_type=Schedule.DAILY
)

我们可以更精确地安排:next_run=arrow.utcnow().replace(hour=18, 分钟=0)

其他轻量级任务队列包括Huey (需要redis)和others .

关于python - 使用后台线程定期刷新字段的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57115845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com