django进程相互干扰

时间:2020-02-17 16:56:02

标签: python django

我认为我的问题可能与Django的多线程性有关,但请告诉我您的想法。

我有一个Django Web项目,该项目最终将被多个用户访问。通过该界面,用户将能够使用名为spiceypy的模块开始计算。这是一个模块,可让您计算行星物体,航天器等的相对位置和速度。

Spiceypy需要在执行计算之前加载“内核集”(又称为“内核库”)。内核集除其他外,还包含有关航天器轨迹的信息。

在我的项目中,不同的用户可能选择使用不同的内核集。我有一个Django Form,它允许您选择内核集,然后执行计算。

这些计算是在基于类的视图的post()方法中完成的。

因此,post方法看起来像这样。

def post(self, request, *args, **kwargs):
    form = self.get_form()

    if form.is_valid():
        data = form.cleaned_data

        spiceypy.furnsh(data['kernel_set']) # THIS LOADS THE KERNEL SET SELECTED BY USER
        spiceypy.<computations>   # THIS PERFORMS VARIOUS SPICEYPY COMPUTATIONS
        spiceypy.unload()  # THIS UNLOADS THE KERNEL SET

        return self.form_valid(form)

我发现,如果多个用户大约在同一时间启动计算,就会产生干扰。例如。假设用户A加载了内核集A,然后计算开始。然后,在计算完成之前,用户B加载内核集B,然后开始计算。 我发现用户A的计算最终使用了错误的内核集(即用户B选择的内核集)

这可能是因为Django开发服务器是多线程而不是单线程。是这样吗?

我真的不想使其成为单线程的(这将是解决方案吗?),因为某些计算需要花费一些时间,并且我不希望用户必须“排队”进行计算。

我想找到一种使流程彼此独立的方法。有人可以推荐最好的方法吗?我是否需要使用类似子流程的东西?还是Django中有一种方法可以让我运行独立的进程?

1 个答案:

答案 0 :(得分:0)

我认为问题出在您所使用的spicepy库中-spicepy混淆了从不同Django线程发送的调用。看起来from this issue似乎不支持多线程。

验证此方法的方法是在Django中禁用线程,然后查看是否可以解决问题。如何执行取决于您在生产中使用的是哪个wsgi服务器。以uwsgi为例,您可以将其添加到您的配置中:

[uwsgi]
processes = 4
threads = 1

(在要添加多个进程以补偿禁用线程的情况下-以便用昂贵的操作阻止一个进程不会阻止其他任何人访问它)。

Django开发服务器也不使用多线程,因此,如果您无法在那里重现问题,那么它将指出这是问题所在。

禁用多线程可能会对性能产生一些影响,您可以通过运行多个进程来减轻这种影响。也不理想,但也不是灾难性的。