M.H*_*.H. 6 django multiprocessing
我正在做一个 Django 项目并尝试提高后端的计算速度。
该任务类似于受 CPU 限制的转换过程
这是我的环境
当我尝试通过 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.")
Run Code Online (Sandbox Code Playgroud)
看起来每个流程导入转换模型和转换模型就像
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)
...
Run Code Online (Sandbox Code Playgroud)
下面是我想要并行的示例函数,每次迭代都是独立的,但会访问或插入数据到 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)
Run Code Online (Sandbox Code Playgroud)
我正在尝试做的是
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)
Run Code Online (Sandbox Code Playgroud)
在computation_api() 中,它会尝试获取当前转换的信息,该信息在此api 调用之前已完成并保存到SQL 中,但这导致了错误。
我的问题是
我可以看到每个进程 SpawnPoolWorker-x 生成并尝试再次启动 django 服务器(为什么?),每个工作人员都会在相同的错误处停止。
计算API会尝试访问sql,这个工作我还没想好怎么处理。(在每个进程中共享数据库连接或创建新连接)
对于将来可能会偶然发现的其他人:
如果您在运行 Python 3.8 并尝试使用多处理包时遇到此问题,很可能是由于子处理是“生成”而不是“分叉”。这是 Mac OS 上 Python 3.8 的更改,其中默认进程启动方法从“fork”更改为“spawn”。这是Django 的一个已知问题。
绕过它:
import multiprocessing as mp
mp.set_start_method('fork')
Run Code Online (Sandbox Code Playgroud)
这个帖子可以解决问题。
Django 升级到 1.9 错误“AppRegistryNotReady:应用程序尚未加载。”
我之前找到了这个答案,但当时并没有真正解决我的问题。
经过反复测试,我必须在导入另一个模型之前添加这些代码,否则子进程将启动失败并给出错误。
import django
django.setup()
from another.app import models
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3300 次 |
| 最近记录: |