Я довольно новичок в 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()
Любая информация о возможных решениях будет принята с благодарностью.
Спасибо