Дублирующая печать (или процесс?) с многопроцессорной обработкойPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Дублирующая печать (или процесс?) с многопроцессорной обработкой

Сообщение Anonymous »

Это моя первая попытка многопроцессорной обработки с использованием библиотеки многопроцессорной обработки Python. Простая версия кода показана ниже -

Код: Выделить всё

import multiprocessing as mp
from dataclasses import dataclass
from typing import Dict, NoReturn
import time
import logging
import signal

import numpy as np

@dataclass
class TmpData:
name: str
value: int

def worker(name: str, data: TmpData) -> NoReturn:
logger_obj = mp.log_to_stderr()
logger_obj.setLevel(logging.INFO)
logger_obj.info(f"name: {name}; value: {data.value}")

if name == "XYZ":
raise RuntimeError("XYZ worker failed")

time.sleep(data.value)

def init_worker_processes() -> None:
signal.signal(signal.SIGINT, signal.SIG_IGN)

if __name__ == "__main__":
map_data: Dict[str, TmpData] = {
key: TmpData(name=key, value=np.random.randint(5, 15))
for key in ["ABC", "DEF", "XYZ"]
}

main_logger = logging.getLogger()
with mp.get_context("spawn").Pool(
processes=2,
initializer=init_worker_processes(),
) as pool:
results = []
for key in map_data:
try:
results.append(
pool.apply_async(
worker,
args=(
key,
map_data[key],
),
)
)
except KeyboardInterrupt:
pool.terminate()

pool.close()
pool.join()

for result in results:
try:
result.get()
except Exception as err:
main_logger.error(f"{err}")

Это выводит что-то вроде следующего:

Код: Выделить всё

[INFO/SpawnPoolWorker-2] name: ABC; value: 10
[INFO/SpawnPoolWorker-1] name: DEF; value: 10
[INFO/SpawnPoolWorker-2] name: XYZ; value: 12
[INFO/SpawnPoolWorker-2] name: XYZ; value: 12
[INFO/SpawnPoolWorker-2] process shutting down
[INFO/SpawnPoolWorker-2] process shutting down
[INFO/SpawnPoolWorker-2] process exiting with exitcode 0
[INFO/SpawnPoolWorker-1] process shutting down
[INFO/SpawnPoolWorker-2] process exiting with exitcode 0
[INFO/SpawnPoolWorker-1] process exiting with exitcode 0
XYZ worker failed
Меня беспокоит имя [INFO/SpawnPoolWorker-2]: XYZ; значение: 12 напечатано дважды. Я предполагаю, что это только проблема с печатью (а не 2 процесса, поскольку сообщение об ошибке сбоя рабочего процесса XYZ приходит только один раз). Проблема не возникает, когда пул инициализируется тремя процессами.
Теперь я хочу понять, в чем основная причина и как ее исправить. Может ли кто-нибудь помочь мне понять, что я делаю неправильно и как это исправить?

Подробнее здесь: https://stackoverflow.com/questions/785 ... processing
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Правильно разорвать процесс при использовании pytest с многопроцессорной обработкой.
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Дублирующая диаграмма панели инструментов Quarto
    Anonymous » » в форуме Python
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Повышает ли нарезка кадров данных в многопроцессорной/многопроцессорной обработке производительность?
    Anonymous » » в форуме Python
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous
  • Создание древовидных задач с многопроцессорной обработкой
    Гость » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Гость
  • Python 3.x — запись в один файл с многопроцессорной обработкой
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

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