특정 프로세스 원할 때 중지하기

sangeun jo·2021년 10월 10일
0

요구사항
클라이언트에서 실시간 분석할 cctv 주소를 주면 flask 서버에서 백그라운드로 처리하고, 나중에 클라이언트에서 분석을 중지하고 싶다고 요청하면 특정 cctv의 실시간 분석 작업을 중지해야한다.

기존코드
백그라운드 작업은 multiprocessing 모듈을 사용하여 처리하기로 하였다. 프로세스를 시작할 때 cctv이름을 부여하여 나중에 cctv이름으로 중지할 프로세스를 찾고자 하였다. 실시간 분석을 중지할 때에는 아래와같이 multiprocessing의 프로세스를 가져와서 루프를 돌면서 중지하고자하는 cctv 이름과 일치하면 중지한다.

for process in multiprocessing.active_children():
	if (process.name == name):
    	process.terminate()
...

문제

이 방법에는 두가지 문제가 있다.

  1. 클라이언트단에서 cctv이름이 중복될 수 있다. 프로세스 이름은 각각이 고유해야한다.
  2. 분석중인 cctv가 늘어날수록, 중지하기까지 시간이 오래걸린다. (선형탐색)

해결

app.py에 프로세스 딕셔너리를 생성하고, 프로세스를 생성할 때 마다 cctv_pk(cctv 별 고유값)을 키로 하여 추가

process_dic = {} #전역 번수 

def run_detect(...):
    ...
    

#cctv 분석 시작 
@app.route('/live/start', methods=['POST'])
def start_detect():
    global process_dic 
    cctv_pk = request.args.get('cctv_pk')
    ...
    #프로세스 생성
    process = mp.Process(
        name=cctv_pk, 
        target=run_detect, 
        args=(...)
    )
    process.start()
    process_dic[cctv_pk] = process  #프로세스 딕셔너리에 프로세스  추가 
    ...

중지할 때에는 cctv_pk를 키로 검색 하여 프로세스 중지

#cctv 실시간 분석 종료 
@app.route('/live/stop', methods=['GET'])
def stop_detect():
    global process_dic 
    cctv_pk = request.args.get('cctv_pk')
    ...
    process = process_dic[cctv_pk] 
    process.terminate() #프로세스 중지 
    del process_dic[cctv_pk] #프로세스 딕셔너리에서 프로세스 삭제 
    ...

앞으로의 개선사항
프로세스 딕셔너리 데이터를 파일로 저장(pickle)했다가, 서버가 중지되었다가 재시작했을 때 이전에 분석중이던 cctv리스트를 불러와서 분석을 시작하도록 만들기

profile
코더가 아니라 개발자가 되자

0개의 댓글