Python: удалить всех работников сельдерея - PullRequest
0 голосов
/ 12 мая 2018

Я хотел бы запускать и останавливать рабочие процессы сельдерея из скрипта Python.Я использую Redis в качестве посредника и бэкэнда.

Я запускаю команду Popen для запуска рабочих изнутри скрипта, который планирует задачи для рабочих:

  # start the celery deamon
  cmd = 'celery worker '
  cmd += '--app intertext.tasks '
  cmd += '--loglevel critical'
  subprocess.Popen(shlex.split(cmd))

После завершения всех шаговЯ хочу удалить все рабочие процессы.Я знаю, что могу сделать что-то вроде ps -ef | grep celery | awk '{print $2}' | xargs kill -9, но это не будет работать в Windows.

Каков лучший способ убить процессы, открытые с помощью Popen (или лучший способ запустить и остановить демона из сельдерея изнутрискрипт Python)?

1 Ответ

0 голосов
/ 12 мая 2018

Я использовал следующий подход:

from psutil import Process
from subprocess import Popen
import shlex

def start_celery():
  '''
  Start the celery deamon.
  @returns:
    subprocess.Popen object that supports pid lookup via
    self.pid
  '''
  cmd = 'celery worker '
  cmd += '--app intertext.tasks '
  cmd += '--loglevel error'
  return subprocess.Popen(shlex.split(cmd))


def terminate_process(pid):
  '''
  Stop a process given its pid or stop all processes if pid
  is a list of identifiers.
  @args:
    int pid: the process identifier of the root process that
      spawned child celery processes
  '''
  process = Process(pid)
  for child in process.children(recursive=True):
    child.kill()
  process.kill()

# main
celery_process = start_celery()

# ...do work... then
terminate_process(celery_process.pid)
...