Выполнение Django команд управления, которые раскручивают несколько процессов и потоков в windows и linux - PullRequest
0 голосов
/ 16 января 2020

Я относительно новичок в многопоточности и многопоточности. Я только что столкнулся с другим блоком обучения, когда понял, что windows и linux по-разному обрабатывают мультиобработку. Я не знаю технических деталей, но я знаю, что это другое.

Я использую django для выполнения моего приложения: python manage.py random_script, в random_script, я импортирую многопроцессорную обработку и вращение различных процессов. я получаю следующую ошибку:

  File "<string>", line 1, in <module>
  File "C:\FAST\Python\3.6.4\lib\multiprocessing\spawn.py", line 99, in spawn_main
    new_handle = reduction.steal_handle(parent_pid, pipe_handle)
  File "C:\FAST\Python\3.6.4\lib\multiprocessing\reduction.py", line 82, in steal_handle
    _winapi.PROCESS_DUP_HANDLE, False, source_pid)
OSError: [WinError 87] The parameter is incorrect

Я пытался добавить это вверху, потому что мой сервер разработки windows, но мой рабочий сервер linux:

if 'win' in sys.platform:
    print('Window')
    multiprocessing.set_start_method('spawn')
else:
    print('Linux')
    multiprocessing.set_start_method('fork')

Но для нет успеха Когда я продолжил просматривать Google, он предложил написать часть процесса, появляющуюся под строкой if __name__ == '__main__':. Это было бы хорошо, если я выполняю свои сценарии нормально (т.е. python random_script.py), но я не выполняю. У меня закончились идеи, и я больше не знаю, как действовать.

++ EDITED ++

manage.py

#!/usr/bin/env python
import os
import sys
import argparse

DEFAULT_SETTINGS_MODULE = "api.test_settings"

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", DEFAULT_SETTINGS_MODULE)
    try:
        from django.core.management import execute_from_command_line
    except ImportError:
        # The above import may fail for some other reason. Ensure that the
        # issue is really that Django is missing to avoid masking other
        # exceptions on Python 2.
        try:
            import django
        except ImportError:
            raise ImportError(
                "Couldn't import Django. Are you sure it's installed and "
                "available on your PYTHONPATH environment variable? Did you "
                "forget to activate a virtual environment?"
            )
        raise
    execute_from_command_line(sys.argv)

random_script.py:

class Command(BaseCommand):
    def __init__(self):
        super().__init__()

    def handle(self, *args, **kwargs):
        <...>
        self.main()

    def main(self):
        <...>

Выше мой manage.py и мой random_script.py.

Спасибо за руководство

1 Ответ

0 голосов
/ 17 января 2020

Каждое приложение имеет основной модуль, который его запускает / запускает.

Для Django команд управления, запускаемых вручную, это manage.py, и вы можете установить там нужный метод:

# manage.py
...

if __name__ == "__main__":
    import multiprocessing
    if 'win' in sys.platform:
        multiprocessing.set_start_method('spawn')
    else:
        multiprocessing.set_start_method('fork')

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
...

И пример настраиваемой команды управления:

# random_script.py


def calculation(x):
    import time
    time.sleep(1)
    return x


class Command(BaseCommand):

    def handle(self, *args, **options):
        calc_args = [1, 2, 3, 4, 5]
        with multiprocessing.Pool(processes=3) as pool:
            results = pool.map(calculation, calc_args)
        self.stdout.write(
            self.style.SUCCESS('Success: %s' % results)
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...