【发布时间】:2017-10-24 10:23:14
【问题描述】:
我正在做一个 Django 项目,并尝试提高后端的计算速度。
任务类似于 CPU 密集型转换过程
这是我的环境
- Python 3.6.1
- Django 1.10
- PostgreSQL 9.6
当我尝试通过 python 多处理库并行计算 API 时,我遇到了以下错误。
File "D:\\project\apps\converter\models\convert_manager.py", line 1, in <module>
from apps.conversion.models import Conversion
File "D:\\project\apps\conversion\models.py", line 5, in <module>
class Conversion(models.Model):
File "C:\\virtenv\lib\site-packages\django\db\models\base.py", line 105, in __new__
app_config = apps.get_containing_app_config(module)
File "C:\\virtenv\ib\site-packages\django\apps\registry.py", line 237, in get_containing_app_config
self.check_apps_ready()
File "C:\\lib\site-packages\django\apps\registry.py", line 124, in check_apps_ready
raise AppRegistryNotReady("Apps aren't loaded yet.")
看起来像每个流程导入转换模型 而转换模型就像
from django.db import models
Conversion(model.Model):
conversion_name = models.CharField(max_length=63)
conversion_user = models.CharField(max_length=31)
conversion_description = models.TextField(blank=True)
...
下面是我想要并行的示例函数,每次迭代都是独立的,但会访问或插入数据到 SQL。
Class ConversionJob():
...
def run(self, p_list):
list_merge_result = []
for p in p_list:
list_result = self.Couputing_api(p)
list_merge_result.extend(list_result)
而我正在尝试做的是
from multiprocessing import Pool
Class ConversionJob():
...
def run(self, p_list):
list_merge_result = []
p = Pool(process=4)
list_result = p.map(self.couputing_api, p_list)
list_merge_result.extend(list_result)
在computing_api()中,它会尝试获取当前已完成的转换信息,并在此api调用之前保存到SQL中,但这会导致错误。
我的问题是
- 为什么导入转换模型会导致Apps are not loaded yet错误,我google了很多文章但实际上并没有解决我的问题。
我可以看到生成的每个 Process SpawnPoolWorker-x 并尝试再次启动 django 服务器(为什么?),每个工作人员都会在相同的错误处停止。
computing API 会尝试访问 sql ,我还没想好怎么处理这个工作。 (共享数据库连接或在每个进程中创建新连接)
【问题讨论】:
-
不要这样做。使用 Celery 之类的东西来运行离线作业。
-
请问如果使用多处理会有什么问题?我在 django 中尝试了一些简单的数学计算,它可以工作,但是当我尝试调用另一个模块时,它会失败并停止并出现此错误。
-
我知道这对于 Web 应用程序(同步执行)来说是不寻常的,但假设我只想在本地机器(127.0.0.1)上安装应用程序,而不是作为 Web 服务器托管。有没有办法通过多处理来加速计算任务?