Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django进程相互干扰_Python_Django - Fatal编程技术网

Python django进程相互干扰

Python django进程相互干扰,python,django,Python,Django,我想我的问题可能与Django的多线程性有关,但请告诉我您的想法 我有一个Django web项目,最终将被多个用户访问。通过该界面,用户将能够使用名为spiceypy的模块启动计算。这是一个模块,允许你计算行星物体、航天器等的相对位置和速度 Spiceypy要求在执行计算之前加载“内核集”即“内核库”。内核集包括关于航天器轨道的信息等 在我的项目中,不同的用户可能会选择使用不同的内核集。我有一个Django表单,它允许您选择内核集,然后执行计算 这些计算是在基于类的视图的post方法中完成的

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

我有一个Django web项目,最终将被多个用户访问。通过该界面,用户将能够使用名为spiceypy的模块启动计算。这是一个模块,允许你计算行星物体、航天器等的相对位置和速度

Spiceypy要求在执行计算之前加载“内核集”即“内核库”。内核集包括关于航天器轨道的信息等

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

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

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

def postself,请求,*args,**kwargs: form=self.get\u form 如果form.u有效: data=表格.U数据 furnshdata['kernel\u set']这将加载用户选择的内核集 香料。这将执行各种Spicepy计算 这将卸载内核集 返回self.form_validform 我发现如果多个用户同时开始计算,就会产生干扰。例如,假设用户A加载内核集A,然后开始计算。然后,在计算完成之前,用户B加载内核集B,并开始计算。我发现用户A的计算最终使用了错误的内核集I/e。用户B选择的内核集

这可能是由于Django开发服务器是多线程的,而不是单线程的。是这样吗

我真的不想让它成为单线程,这是一个解决方案吗?因为有些计算需要一段时间,我不希望用户不得不排队等待他们的计算


我想找到一种方法使这些过程相互独立。有人能推荐最好的方法吗?我需要使用类似子流程的东西吗?或者Django中是否有允许我运行独立进程的方法

我认为问题在于您使用的spicepy库——spicepy将来自不同Django线程的调用混合在一起。看起来它不支持多线程

验证这一点的方法是在Django中禁用线程,并查看这是否解决了问题。如何做到这一点取决于您在生产中使用的wsgi服务器。以uwsgi为例,您可以将其添加到配置中:

[uwsgi]
processes = 4
threads = 1
您正在添加多个进程以补偿禁用线程的情况—这样,用昂贵的操作阻塞一个进程不会阻止其他任何人访问它

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


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

嗨,爱玛!我认为你需要更详细地了解,因为很难理解你在问什么。一、 至少,你不了解你的流程为什么会发生冲突。请提供一个详细的例子,说明你在做什么,出了什么问题,包括代码。我不需要详细说明这个模块是如何工作的——我想你可能会这样做。不同用户的请求通常不会相互干扰。对不起,格雷格和克里斯,我希望我的编辑能让事情变得更清楚。谢谢。这真是太有用了。非常感谢你。需要注意的是,我认为Django开发在默认情况下实际上是多线程的。来自Django 1.4发行说明:开发服务器现在默认为多线程。使用runserver-nothreading选项来禁用开发服务器中线程的使用:如果使用-nothreading选项,我确实看到问题消失了,但这很奇怪。第二个进程确实会等待第一个进程完成,但在某些情况下,第二个进程只是暂停,什么也没有发生。但我们将尝试多重处理。非常感谢。