Korzystając z , staramy się dynamicznie zarządzać procesami roboczymi. Używamy niestandardowy zbudowany skrypt pracownik, który (w uproszczonej formie) jest następujący:Jak poprawnie zamknąć procesy robocze Pythona RQ w sposób dynamiczny?
from rq import Connection, Worker
queues_to_listen_on = get_queues_to_listen_on()
with Connection(connection = get_worker_connection()):
w = Worker(queues_to_listen_on)
w.work()
Jesteśmy szczególnie zainteresowani wyłączenia pracowników. Głównym problemem, jaki mamy, jest to, jak wykonać pełne wdzięku zamknięcie pracownika, w sposób umożliwiający ukończenie bieżącej pracy przed zamknięciem. Obsługa sygnału request_stop(...)
na odpowiednim obiekcie Worker
wydaje się robić to, czego potrzebujemy, ale wydaje się, że nie ma żadnego sposobu (przynajmniej według mojej wiedzy) na jego emisję, chyba że poprzez naciśnięcie CTRL+C
na proces roboczy uruchomiony w terminalu.
Jak ja to widzę, istnieją dwa prawdopodobne rozwiązania (nie może z pewnością być więcej) - w kolejności preferencji:
- programowo przy użyciu biblioteki
rq
, wysyła sygnał dorequest_stop
a tym samym wywołać wdzięku shutdown . - W jakiś sposób pobierz pid z prawidłowego procesu (nie wiesz, czy proces workhorse lub proces nasłuchujący pracownika) i używając innej metody, wyślij odpowiedni sygnał do tego procesu. Mamy na to kilka sposobów, ale prawdopodobnie wymagałoby to więcej pracy i wprowadzenia innych zmiennych do problemu, który wolałbym pominąć (na przykład, używając
Fabric
do uruchomienia zdalnego polecenia lub czegoś podobnego).
Jeśli istnieje lepszy sposób na rozwiązanie tego problemu lub inną alternatywę, która pozwoliłaby osiągnąć ten sam cel, byłbym wdzięczny za sugestie.
Jeśli potrzebujesz PID, możesz go po prostu pobrać z w.pid – Borys