Обзор:
Я пытаюсь использовать пул внутри модуля, который не является __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
Как multiprocessing.Pool() создает дочерние процессы? ⇐ Python
Программы на Python
-
Anonymous
1764252679
Anonymous
[b]Обзор:[/b]
Я пытаюсь использовать пул внутри модуля, который не является __main__, и сделать невидимым для main существование этого пула.
Из-за этого, если __name__ == "__main__": защита неприменима.
Когда я запускаю свой пул на верхнем уровне модуля, я получаю AttributeError для функций, объявленных впоследствии на верхнем уровне того же модуля. См. минимальный воспроизводимый пример в конце.
Эта проблема упоминалась в разделе Python multiprocessing.Pool: AttributeError, где ответ гласит:
Вы запускаете пул до того, как вы определяете свою функцию и классы, поэтому дочерние процессы не могут наследовать какой-либо код.
[b]Что я нашел out[/b]
Насколько я понимаю, дочерний процесс создается в модуле __main__ во время импорта, а затем копирует все, от импортированного модуля до определения пула.
Я понимаю, что при таком подходе пул будет запущен и в моем дочернем процессе. Однако, похоже, это не является причиной ошибки AttributeError, поскольку перемещение определения функции до запуска пула не вызывает никаких ошибок.
[b]Мой вопрос[/b]
Как именно пул инициализирует эти дочерние процессы и почему он был реализован таким образом? Какие ошибки это предотвращает по сравнению с импортом всего тестового модуля в дочерний процесс?
[b]Минимальный пример:[/b]
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()
[b]Ошибка при запуске[/b] 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
Подробнее здесь: [url]https://stackoverflow.com/questions/79831766/how-does-multiprocessing-pool-create-its-child-processes[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия