Остановка rq работника не останавливает основной процесс ffmpeg - PullRequest
1 голос
/ 23 марта 2020

Я довольно новичок в python и rq и пришел к точке, которую не могу решить самостоятельно.

Я использую ffmpeg- python для кодирования прямых трансляций, это распространяется в rq рабочие и отображаются в веб-приложении с использованием flask, но поскольку прямые трансляции могут go работать вечно, мне нужен какой-то способ остановить этот процесс, пока он еще выполняется. Открытие терминала, где работник rq выполняет задачу и нажатие клавиши «q» (ярлык ffmpeg для выхода) работает, и помечает задание как «ОК», но я должен быть в состоянии сделать это из моего веб-приложения.

Я попытался получить идентификатор работника и отправить его SIGKILL, это останавливает работника , но задача продолжает выполняться , чего я совсем не понимаю. Это как если бы сам процесс ffmpeg выполнялся где-то еще, и остановка рабочего не остановила ffmpeg. Обратите внимание, что я не использую ffmpeg.run_asyn c, я использую ffmpeg.run , который, насколько мне известно, не должен выполняться асинхронно. Во время кодирования потоковой передачи работник помечается как занятый и имеет правильно назначенный идентификатор задания, поэтому я действительно не понимаю, почему, когда работник убит, основной процесс все еще выполняется.

Если вместо отправки SIGKILL я отправляю SIGTERM, работник говорит, что ждет теплого выхода и никогда не закрывается, поскольку процесс ffmpeg все еще делает свое дело.

Один из моих Идея заключалась в том, чтобы попытаться отправить клавишу «q» рабочему (что я понятия не имею, как сделать, хотя я проводил некоторые исследования) или попытаться переключиться с rq на сельдерей, который предположительно поддерживает отмену задач, которые выполняется.

Это мой файл маршрутов

@app.route('/streamings', methods=['GET', 'POST'])
@login_required
def streamings():
...
    if form2.submit_stop.data and form2.validate():
        conn1 = Redis.from_url('redis://')
        queue = rq.Queue('tasks-q', connection=Redis.from_url('redis://'))
        workers = rq.Worker.all(queue=queue)

        for worker in workers:
            peine = worker.get_current_job_id()
            if peine == form2.fld1.data:
                os.kill(worker.pid, signal.SIGKILL)

и это мой файл задач

def restream(origin, server, stream_key):
    stream_server = generate_url(server, stream_key)
    try:
        stream_map = None
        stream1 = ffmpeg.input(get_manifest(origin), re=None)
        stream2 = ffmpeg.input('mosca_66.png')
        stream_ol = ffmpeg.overlay(stream1, stream2, x='main_w-overlay_w-50', y='50')
        a1 = stream1.audio
        stream = ffmpeg.output(stream_ol, a1, stream_server, format='flv', vcodec='libx264', acodec='aac', preset='medium', g='120', crf='23', maxrate='4M', bufsize='5M', channel_layout='stereo')
        print(stream.get_args())
        ffmpeg.run(stream)
    except:
        set_complete() 

Любая информация о возможных решениях будет принята с благодарностью.

Спасибо

...