Django DB查询变为“None”,如在长时间运行的管理命令中的DEBUG=True所示

2024-10-01 07:45:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我在几种模式下使用Django 2.2,其中一种是在Supervisord下运行的长时间运行的管理命令,用于处理入站松弛消息。经过几周的测试,效果良好。然而,今天我目睹了一些我无法解释的令人不安的事情

我在一个测试环境中运行所有这些,所以我将DEBUG设置为True,并显示了我的记录器调试级别。因此,我可以看到每个DB查询,并且对问题发生的位置有很好的了解

该任务已经正常运行了大约17个小时,与过去(许多天)成功运行的时间相比,这算不了什么。实际发生的情况是,应该发送到数据库的实际查询开始为空。它在数据库日志中显示为“无”。查询是一个简单的对象筛选器:

if not bool(SlackChannel.objects.filter(id=event['channel'])):
    return

这就是它开始表现出来的样子:

2020-05-29 10:58:36,001 DEBUG utils (0.000) None; args=('SKFHJ7H5S6',)

当一切顺利时,应该是这样的:

2020-05-29 10:58:36,001 DEBUG utils (0.000) SELECT `item`.`id`, `item`.`name`, `item`.`info` FROM `item` WHERE `item`.`id` = 'SKFHJ7H5S6'; args=('SKFHJ7H5S6',)

一旦进入这种模式,它是完全可复制的。后来当我重新启动这个过程时,问题消失了一段时间,但最终又出现了。从那以后,我一次又一次地注意到同样的模式

也值得注意。。我在这个任务中有两个线程。查询在另一个线程中继续正常工作(尽管这些查询用于完全不同的对象),即使在出现此问题的线程开始出现之后也是如此。此外,我拥有的其他Django任务+web服务器都继续正常工作

这可能是什么原因造成的


Tags: 对象djangodebug命令id数据库消息模式
1条回答
网友
1楼 · 发布于 2024-10-01 07:45:33

在与Slack Client API开发人员进行了some back and forth和一些额外的测试之后,我得出结论,这很可能是由于Slack Client和Django之间的交互不良造成的。这可能是由于异步,因为Django 2.2不支持异步,即使我在“同步模式”下运行Slack客户端

Slack客户机开发人员建议一个解决方案可能是使用Q将Django对消息的处理与消息的接收分离,我同意这一点。但是,如果已经实施了一种不同的方法,那么一种似乎有效的更快的解决方案>;99%的时间是让Supervisord每小时自动重启一次流程。如果你要从下面的2个模块中建立一个解决方案,你应该考虑Q方法。

相关问题 更多 >