2016-08-25 16 views
6

Wiem, że to częste pytanie i podobne pytanie, takie jak this, ale chcę poprosić o najlepszy sposób dopasowania mojego scenariusza, ponieważ nie używałem teraz selera.Procesy demona nie mogą mieć dzieci

W moim scenariuszu usługi będzie używane przetwarzanie wieloprocesowe. Aby utworzyć zamówienie obejmujące wiele kampanii, w każdej kolejności kampanii nadal będzie używane przetwarzanie wieloprocesowe. Aby utworzyć wiele reklam (kampania i reklama są relacjami 1toM).

Jak wiesz, jeśli ustawię wiele procesów zarówno w kampanii, jak i części do tworzenia reklam, to się nie powiedzie, ponieważ "procesy demoniczne nie mogą mieć dzieci", myślę, że seler może spotkać podobny problem, mimo że nie użyłem go teraz.

Moje pytanie brzmi, jaki jest ogólny sposób rozwiązania tego rodzaju problemu? czy powinienem nadal używać selera, czy jakoś go obejść?

Thanks a lot

Odpowiedz

0

1. Walne Dobry Obejście

Należy użyć kolejkę komunikatów oddzielić

Na przykład

  1. główny program, należy utworzyć zadanie, aby przesunąć queue_1

  2. pracownik wielu kampanii Zadanie od kolejki_1, przetwarzanie i przekazywanie niektórych zadań do wielu zadań w kolejce, aby przetworzyć zadanie z Queue_2, Process, done.

Logika jest prosta, łatwa do wdrożenia przez użytkownika. Istnieją również istniejące biblioteki dla takich rzeczy, takie jak rq/celery.

2. Proste Obejście

Jeśli dostać AssertionError, stosowanie nici zamiast

def run_in_subprocess(func, *args, **kwargs): 
    from multiprocessing import Process 
    thread = Process(target=func, args=args, kwargs=kwargs) 
    thread.daemon = True 
    thread.start() 
    return thread 

def run_in_thread(func, *args, **kwargs): 
    from threading import Thread 
    thread = Thread(target=func, args=args, kwargs=kwargs) 
    thread.daemon = True 
    thread.start() 
    return thread 

def run_task(config): 
    try: 
     run_in_subprocess(xxxx_task, config) 
    except AssertionError: 
     print('daemonic processes are not allowed to have children, use thread') 
     run_in_thread(xxxx_task, config) 

Używam tego kodu w jakiejś aplikacji demo, ale nie zaleca stosowania w produkcji.

Powiązane problemy