Как multiprocessing.Pool() создает дочерние процессы?Python

Программы на Python
Ответить
Anonymous
 Как multiprocessing.Pool() создает дочерние процессы?

Сообщение Anonymous »

Обзор:
Я пытаюсь использовать пул внутри модуля, который не является __main__, и сделать невидимым для main существование этого пула.
Из-за этого, если __name__ == "__main__": защита неприменима.
Когда я запускаю свой пул на верхнем уровне модуля, я получаю AttributeError для функций, объявленных впоследствии на верхнем уровне того же модуля. См. минимальный воспроизводимый пример в конце.
Эта проблема упоминалась в разделе Python multiprocessing.Pool: AttributeError, где ответ гласит:

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

Что я нашел out
Насколько я понимаю, дочерний процесс создается в модуле __main__ во время импорта, а затем копирует все, от импортированного модуля до определения пула.
Я понимаю, что при таком подходе пул будет запущен и в моем дочернем процессе. Однако, похоже, это не является причиной ошибки AttributeError, поскольку перемещение определения функции до запуска пула не вызывает никаких ошибок.
Мой вопрос
Как именно пул инициализирует эти дочерние процессы и почему он был реализован таким образом? Какие ошибки это предотвращает по сравнению с импортом всего тестового модуля в дочерний процесс?
Минимальный пример:
test.py
from multiprocessing import Pool

_pool = Pool(2)

def script_wrapper():
print("foo")

def script_runner():
_pool.apply_async(script_wrapper)
_pool.close()
_pool.join()

main.py
from test import script_runner

if __name__ == "__main__":
script_runner()

Ошибка при запуске main.py
Traceback (most recent call last):
File "/usr/lib/python3.12/multiprocessing/process.py", line 314, in _bootstrap
self.run()
File "/usr/lib/python3.12/multiprocessing/process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "/usr/lib/python3.12/multiprocessing/pool.py", line 114, in worker
task = get()
^^^^^
File "/usr/lib/python3.12/multiprocessing/queues.py", line 389, in get
return _ForkingPickler.loads(res)
^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: Can't get attribute 'script_wrapper' on


Подробнее здесь: https://stackoverflow.com/questions/798 ... -processes
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»