Когда я использую мультипроцесс для выполнения чего-либо в методе flask post, процесс не будет работать, пока я не нажму Ctrl + c для выхода из сервера. - PullRequest
0 голосов
/ 12 февраля 2020

Возникает невероятный вопрос. Я хочу использовать многопроцессный python, чтобы эффективно начать какую-то работу! Но I когда я что-то делаю в методе post flask, возникает проблема: многопроцессный процесс не работает, пока Я нажимаю Ctrl + c, чтобы выйти из процесса!

Это flask index.py

from flask import Flask, request
from flask_cors import *
import component.recognize.recognize as voice
import json
from multiprocessing import Process
import os

app = Flask(__name__)

CORS(app, resources={r"/api/*": {
    "origins": "*",
    "methods": "POST",
    "allow_headers": "*"
}})


@app.route('/api/getRecognizeSongResult', methods={'POST'})
def get_voice_file():
    if request.method == "POST":
        some_file_list = os.listdir('../')
        npy_file_list = []
        process_list = []
        result_list = []
        for i in some_file_list:
            if i.endswith(".npy") and i.startswith("database"):
                npy_file_list.append(i)

        filename = request.form.get("id")
        path = "upload/media/audio/" + filename + ".wav"

        f = open(path, "wb")
        f.write(request.files['file'].read())
        f.close()

        rec = voice.voice()

        p1 = Process(target=rec.recognize, args=(path, os.path.join("../", npy_file_list[2])))
        p2 = Process(target=rec.recognize, args=(path, os.path.join("../", npy_file_list[1])))
        p1.start()
        p2.start()
        p1.join()
        p2.join()
        print(result_list)
        return json.dumps(result_list)

    else:
        return "ILLEGAL METHOD"


app.config.update(
    DEBUG=False
)
app.run()

Это распознавание.py

# -*- coding: utf-8 -*-
from dtw import dtw
from numpy.linalg import norm
from numpy import array
import numpy as np
import librosa
from multiprocessing import Process
import os


class voice:
    def recognize(self, wav_path, beat_database_path=None):
        print(beat_database_path)
        data = np.load(beat_database_path, allow_pickle=True)
        beat_database = data.item()

        if wav_path.endswith(".wav"):
            y, sr = librosa.load(wav_path)
            tempo, beats = librosa.beat.beat_track(y=y, sr=sr)
            beats = librosa.feature.delta(beats)
            x = array(beats).reshape(-1, 1)
            result = {}
            for song in beat_database.keys():
                y = beat_database[song]
                y = array(y).reshape(-1, 1)
                dist, cost, acc, path = dtw(x, y, dist=lambda x, y: norm(x - y, ord=1))
                print('distance ', song.split("\\")[1], ": ", dist)
                result[song] = dist
            matched = min(result, key=result.get)
            print("================================================")
            print("Playing song is ", matched.split("\\")[1].split(".wav")[0])
            return {
                "name": matched.split("\\")[1].split(".wav")[0].split("-")[0].strip(),
                "singer": matched.split("\\")[1].split(".wav")[0].split("-")[1].strip(),
                "distance": dist
            }
        else:
            print(IOError)

Многопроцессный режим не работает Когда Flask получает пост-запрос, пока я не нажму ctrl + c, чтобы остановить сервер! Я не так, как это сделал!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...