python停止rq worker不会停止底层ffmpeg进程

wnavrhmk  于 2021-06-09  发布在  Redis
关注(0)|答案(0)|浏览(334)

我对python和rq相当陌生,已经到了一个我自己无法解决的地步。
我正在使用ffmpeg-python对livestreams进行编码,这是在rq workers中分发的,并使用flask显示在web应用程序上,但是由于livestreams可以永远持续下去,所以我需要一些方法在它仍在执行时停止这个过程。打开rq worker正在执行任务的终端,然后按“q”(ffmpeg shortcut to quit),并将作业标记为ok,但我需要能够从我的web应用程序执行此操作。
我已经尝试获取worker id并向其发送sigkill,这会停止worker,但任务仍在继续运行,这是我完全不理解的。就好像实际的ffmpeg进程是在其他地方执行的,停止worker并没有停止ffmpeg。请注意,我没有使用ffmpeg.run\u async,我使用的是ffmpeg.run,据我所知,它不应该异步执行。在对流进行编码时,worker被标记为busy,并正确地分配了作业id,所以我真的不明白为什么当worker被终止时,底层进程仍在执行。
如果不是发送一个sigkill而是发送一个sigterm,那么工作者说它在等待一个温暖的出口,并且永远不会关闭,因为ffmpeg进程仍然在做它自己的事情。
我的一个想法是尝试向工作人员发送一个“q”键(即使我做了一些研究,我也不知道该怎么做),或者尝试从rq切换到celery ,这应该支持取消正在执行的任务。
这是我的路由文件

@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()

如果您对可能的解决方案有任何见解,我们将不胜感激。
谢谢

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题