如何在Django命令中使用多进程? [英] How to use multiprocess in django command?

查看:27
本文介绍了如何在Django命令中使用多进程?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试在django命令中使用ProcessPoolExecutor同时获得一些结果。我尝试使用以下代码获取它

# main codes


import json
import time
import datetime
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor


from redis import Redis
from django.conf import settings
from django.core.management.base import BaseCommand
from thrift.transport import TSocket, TTransport
from thrift.protocol import TBinaryProtocol

from utils.cache import pool
from services.analysis.thrift.Analysis import Client, Dashparam
from api.analysis.models import MDashBoard


redis_con = Redis(connection_pool=pool)

class AnalysisThriftService(object):

    def __init__(self):
        ...

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.transport.close()



class Command(BaseCommand):
    help = 'python manage.py --settings "xxx"'

    def add_arguments(self, parser):
        parser.add_argument('--dashboard_id', type=int, help="ID")

    @staticmethod
    def _handle_with_thrift(dashboard_id):
        try:
            print(dashboard_id)
            with AnalysisThriftService() as thrift_server:
                dashboard_result = ...
                
        except:
            import traceback
            traceback.print_exc()

    def handle(self, *args, **options):
        dashboard_id = options["dashboard_id"]
        if dashboard_id is None:
            dashboard_tables = [dashboard.id for dashboard in MDashBoard.objects.all()]
            with ProcessPoolExecutor(max_workers=5) as executor:
                executor.map(Command._handle_with_thrift, dashboard_tables)

        else:
            ...

但我总是收到类似

的错误
Process Process-5:
Process Process-2:
Traceback (most recent call last):
  File "D:python3libmultiprocessingprocess.py", line 258, in _bootstrap
    self.run()
  File "D:python3libmultiprocessingprocess.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "D:python3libconcurrentfuturesprocess.py", line 169, in _process_worker
    call_item = call_queue.get(block=True)
  File "D:python3libmultiprocessingqueues.py", line 113, in get
    return _ForkingPickler.loads(res)
  File "C:UsersDomobDesktopdevmyapianalysismanagementcommandsdashboard_schedule_task.py", line 15, in <modu
le>
    from api.analysis.models import MDashBoard
  File "C:UsersDomobDesktopdevmyapianalysismodels.py", line 4, in <module>
    from utils.models import BasicModel, StaticCharField
  File "C:UsersDomobDesktopdevmyapiutilsmodels.py", line 9, in <module>
    class BasicModel(models.Model):
  File "C:UsersDomobDesktopdevvenv_myapilibsite-packagesdjangodbmodelsase.py", line 103, in __new__
    app_config = apps.get_containing_app_config(module)
  File "C:UsersDomobDesktopdevvenv_myapilibsite-packagesdjangoapps
egistry.py", line 252, in get_containing_ap
p_config
    self.check_apps_ready()
  File "C:UsersDomobDesktopdevvenv_myapilibsite-packagesdjangoapps
egistry.py", line 135, in check_apps_ready
    raise AppRegistryNotReady("Apps aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

如何才能获得预期结果。

非常感谢。

推荐答案

您需要为子进程初始值设定项函数中的子进程设置django。

def subprocess_setup():
    django.setup()
    # Could do other things here

# ...

with ProcessPoolExecutor(max_workers=5, initializer=subprocess_setup) as executor:
   

这篇关于如何在Django命令中使用多进程?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆