Python Multiprocessing.pool висит под запуска Debugpy в Windows («Spawn»), даже с Freeze_supportPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Python Multiprocessing.pool висит под запуска Debugpy в Windows («Spawn»), даже с Freeze_support

Сообщение Anonymous »

Я сталкиваюсь с проблемой, в которой мой скрипт Python с использованием Multiprocessing.pool висит во время запуска, но только при запуске через Debugpy Debugger/Launcher, интегрированный с VS -кодом в Windows. При запуске непосредственно с терминала (python my_script.py), скрипт работает правильно и использует многопроцессорную пул, как и ожидалось. Windows) < /p>
Контекст отладки: запускается через Debugpy (стандартный VS -кодовый конфигурация отладки Python Python: текущий файл) < /p>
Проблема: < /p>
Скрипт успешно завершает свои начальные фазы настройки (регистрация, загрузка параметра, генерация списка задач). Однако, когда он достигает точки, где он инициализируется или начинает использовать многопроцесс. Никакие сообщения об ошибках или трассах не производятся в основном процессе; Он просто перестает прогрессировать прямо перед тем, как пул начинает обработку задач.import multiprocessing
from multiprocessing import freeze_support #, set_start_method # Tried adding this too
import time
import os
import sys
import logging # Using basic logging setup similar to full script

# --- Worker function (Defined globally) ---
# Simplified worker, the real one calls a complex simulation function
def simple_worker_function(task_arg):
pid = os.getpid()
print(f"--- [Worker {pid}] Started task: {task_arg} ---", file=sys.stderr, flush=True)
time.sleep(0.1) # Simulate work
result = task_arg * task_arg
print(f"--- [Worker {pid}] Finished task: {task_arg} ---", file=sys.stderr, flush=True)
# In reality, returns a tuple: (task_id_tuple, result_dictionary)
return (task_arg, result) # Simple return for example

# --- Main Execution Guard ---
if __name__ == "__main__":
# --- Essential setup for multiprocessing on Windows/spawn ---
freeze_support()
# --- Tried adding this, didn't help (might give warning if context already set) ---
# try:
# set_start_method('spawn')
# except RuntimeError:
# pass

# --- Simulate Script Setup ---
logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)-8s] %(message)s')
logging.info("Main: Initial setup complete.")
# Simulate generating task arguments
task_arguments = list(range(20)) # Example dummy tasks
logging.info(f"Main: Generated {len(task_arguments)} tasks.")

# --- Execution Phase ---
execution_start_time = time.time()
results_from_workers = {} # Store results

if not task_arguments:
logging.info("Main: No tasks to run.")
else:
try:
# Determine number of workers
logical_cores = os.cpu_count() or 2
num_workers = min(max(1, logical_cores - 1), len(task_arguments))
logging.info(f"Main: Preparing to start Pool with {num_workers} workers.")

# >

with multiprocessing.Pool(processes=num_workers) as pool:
logging.info("Main: Pool created. Submitting tasks using map...")
# Tried pool.imap_unordered(...) as well, same hang behavior under debugpy

# Use map (blocks until all done) for simpler debugging attempt
worker_outputs = pool.map(simple_worker_function, task_arguments)

logging.info(f"Main: Pool.map finished, processing {len(worker_outputs)} results...")
for task_id_out, result_val in worker_outputs:
results_from_workers[str(task_id_out)] = result_val # Simulate storing results

logging.info(f"Main: Finished processing pool results. {len(results_from_workers)} tasks completed.")

except KeyboardInterrupt:
logging.warning("Main: Keyboard Interrupt during execution.")
except Exception as e:
logging.error(f"Main: Error during multiprocessing execution: {e}", exc_info=True)

# --- Final Summary ---
execution_duration = time.time() - execution_start_time
logging.info(f"--- Main: Execution phase completed in {execution_duration:.2f} sec ---")
logging.info(f"--- Main: Script Finished ---")

< /code>
Что происходит: < /p>
при непосредственном запуске (python my_script.py), он печатает «Main: подготовка ...», «Main: генерируется ...», «Main: подготовка к пулу ...», «Main: Pool Created ...», «Main: Preceping ...», «Основные сообщения» (TO STDERR), «Main: Pool.MAP». «Main: Script завершен.». а затем висит бесконечно. Он никогда не печатает «Главный: пул создан ...» или любые последующие сообщения. run_single_task_wrapper в моем реальном коде) определяется на верхнем уровне модуля, а не внутри основного блока. Это исправило более ранний атрибут. Иногда это генерирует безвредное предупреждение о том, что контекст уже установлен, но не исправляет подвес. /> Последовательное выполнение: если я полностью обойду пул и последовательно запускаю рабочую функцию в простых для цикла в рамках основного процесса, он работает хорошо, даже при Debugpy. Были применены исправления функции Freeze_support () и глобальной рабочей функции? Существует ли известный конфликт или конкретный способ отладки, мешает созданию процесса порождения, которое требует дополнительных обходных путей за пределами стандартных? Как я могу диагностировать это дальше или разрешить подвеску, чтобы допустить отладку параллельной части?

Подробнее здесь: https://stackoverflow.com/questions/796 ... ws-spawn-e
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Ошибка памяти. Я получил ошибку файла Python multiprocessing\spawn.py при обучении набора данных с помощью yolov5.
    Anonymous » » в форуме Python
    0 Ответы
    71 Просмотры
    Последнее сообщение Anonymous
  • Python multiprocessing.Pool.map не ускоряет код частичной функции
    Anonymous » » в форуме Python
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Python multiprocessing.Pool.map не ускоряет код частичной функции
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Python multiprocessing.Pool.map не ускоряет код частичной функции
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Python Multiprocessing Queue Pool работает в функциональном коде, но не в ООП
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

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