调用PythonC扩展将阻止所有Django进程/用户

2024-09-23 00:19:48 发布

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

问题

我编写了一个PythonC扩展(ftaCalculate),以提高以前用纯Python编写的给定函数的性能。我已经能够将执行速度提高x10倍,所以在这个站点上没有问题

import ftaCalculate

cs_min = ftaCalculate.mcs(N, tree)

但是,我正在Django框架中执行此函数。问题是,在函数ftaCalculate.mcs没有完成之前,我不能在我的网站上做任何事情。在Python中使用该函数时,我可以按其他按钮并访问其他URL

当多个用户同时在网站中工作时,这是一个特别的问题,因为其他用户在执行此功能时无法执行任何操作

实际上,您可以在下图中看到,在运行函数时,一个内核处于100%状态:

enter image description here

问题:

你知道有什么方法可以在不“冻结”Django框架的情况下调用我的PythonC扩展吗

可能的解决办法

在最坏的情况下,我可以尝试用Celery调用这部分代码。然而,我更喜欢另一种解决方案,因为在纯Python中运行时不需要芹菜


Tags: django函数用户import框架站点网站情况
1条回答
网友
1楼 · 发布于 2024-09-23 00:19:48

正如@Kemp所说,问题出在全局解释器锁(GIL)上。解决方案是在我不使用任何Python对象时释放GIL,然后重新获取它

Releasing the GIL from extension code section的详细信息之后,我将相应的C代码放在以下两行之间:

Py_BEGIN_ALLOW_THREADS
... Code dealing only with C objects ...
Py_END_ALLOW_THREADS

这允许在执行函数时调用Django中的其他进程

相关问题 更多 >