Mam taki kod

import multiprocessing as mp

processes = []
for i in range(10):
  p = mp.Process(target=my_func, args=args)
  processes.append(p)
  p.start()

for p in processes:
  p.join()

Jeśli w my_func jest błąd, który powoduje awarię wszystkich wątków, chcę, aby mój proces nadrzędny wykrył to i również zgłosił wyjątek. Jak mogę wykryć, czy proces zakończył się poprawnie po dołączeniu do procesów?

0
Aaron 5 marzec 2020, 07:45

2 odpowiedzi

Najlepsza odpowiedź

Przeczytaj wartość procesu 'exitcode:

  • None jeśli proces jeszcze się nie zakończył.
  • 0 jeśli proces zakończył się pomyślnie.
  • N jeśli proces wystąpił błąd i zakończył działanie z kodem N.
  • -N jeśli proces został zabity sygnałem N. (np. -15 jeśli zabity przez SIGTERM)

Na przykład w głównym procesie:

for p in processes:
    p.join()
    if p.exitcode > 0:
        raise ValueError(f'a process exited with code {p.exitcode}')

A w twojej pracy:

try:
    do_something()
except KnownError as _:
    exit(my_known_error_code)
1
fixmycode 5 marzec 2020, 05:21

Kod zakończenia możesz sprawdzić, dzwoniąc pod numer join().

Na przykład:

for p in processes:
  p.join()
  if p.exitcode is not 0:
    exit(1)

Odniesienie:

1
Yeheshuah 5 marzec 2020, 05:22