gpt4 book ai didi

python - 调用 Python C 扩展会阻止所有 Django 进程/用户

转载 作者:行者123 更新时间:2023-12-04 07:47:56 24 4
gpt4 key购买 nike

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

import ftaCalculate

cs_min = ftaCalculate.mcs(N, tree)
但是,我正在 Django 框架中执行此功能。问题是,直到函数 ftaCalculate.mcs没有完成,我不能在我的网站上做任何事情。当函数在 Python 中时,我可以按其他按钮并访问其他 URL。
当多个用户同时在网站上工作时,这是一个特别的问题,因为在执行此功能时其他用户无法做任何事情。
实际上,您可以在下图中看到运行该函数时一个内核处于 100%:
enter image description here

你知道有什么方法可以在不“卡住”Django 框架的情况下调用我的 Python C 扩展吗?
可能的解决方法
在最坏的情况下,我可以尝试使用 Celery 调用这部分代码。 .但是,我更喜欢另一种解决方案,因为在纯 Python 中运行时我不需要 Celery。

最佳答案

正如@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 中的其他进程。

关于python - 调用 Python C 扩展会阻止所有 Django 进程/用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67122930/

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