Многопроцессорный процесс Python запущен дважды?

Запуск следующего скрипта Python 3 и по какой-то причине, которую я не могу понять, функция startWebview выполняется дважды, что приводит к открытию двух окон PyWebView.

# Import Modules Here
import os
import time
import webview
import os.path
import multiprocessing
from dotenv import load_dotenv
from flask_wtf import FlaskForm
from flask_mde import Mde, MdeField
from wtforms import SubmitField, StringField
from wtforms.validators import InputRequired, DataRequired, Length
from flask import Flask, request, render_template, flash, session, url_for

app = Flask(__name__)
load_dotenv()
mde = Mde(app)
app.config['SECRET_KEY'] = os.environ.get("FLASK_SECRET_KEY")

windowTitle = os.environ.get("WINDOW_TITLE")
fileDirPath = os.environ.get("FILE_DIRECTORY")


def error_flasher(form):
    for field, message_list in form.errors.items():
        for message in message_list:
            flash(form[field].label.text + ': ' + message, 'error')
    print(message, message_list)


def fileHandler(form):
    savePath = os.path.join(fileDirPath, form.title.data)
    f = open(savePath, "w+")
    f.write(form.editor.data)
    f.close()


def contentLoader(form):
    savePath = os.path.join(fileDirPath, form.title.data)
    fileName = savePath
    f = open(fileName, "r")
    return f.read()


class MdeForm(FlaskForm):

    title = StringField('Title', validators=[DataRequired()])

    editor = MdeField(
        validators=[
            #InputRequired("Input required"),
            Length(min=0, max=30000)
        ]
    )
    submit = SubmitField()


@app.route('/', methods=['GET', 'POST'])
def index():
    form = MdeForm()

    if form.validate_on_submit() and form.editor.data == "":
        form.editor.data = contentLoader(form)

    elif form.validate_on_submit() and form.editor.data != "":
        session['editor'] = request.form['editor']
        fileHandler(form)
        form.title.data = ""
        form.editor.data = ""

    return render_template("index.html", form=form, windowTitle=windowTitle)


def startFlaskServer():
    app.run(debug=True)


def startWebview():
    webview.create_window(windowTitle, 'http://localhost:5000')
    webview.start(debug=True)


if __name__ == "__main__":

    p1 = multiprocessing.Process(target=startFlaskServer)
    p2 = multiprocessing.Process(target=startWebview)

    p1.start()
    time.sleep(2)
    p2.start()
    p2.join()
    p1.terminate()

Как видно на изображении выше, может показаться, что причиной являются два запроса GET, поскольку второй Webview загружается только после второго запроса GET.

Заранее спасибо!

Я очень мало знаю о Flask, но обратите внимание, что создание процесса приводит к повторной оценке файла в новом процессе. Демонстрация. Я понятия не имею, будет ли этот материал наверху, оцениваемый более одного раза, иметь эффект, который вы описываете, но на это стоит обратить внимание.

Carcigenicate 25.12.2020 17:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
1 257
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, что эта проблема вызвана многопроцессорной повторной оценкой файла, как это было предложено @Carcigenicate.

Проблема решена путем перехода от многопоточности к многопоточности.

Однако будьте очень осторожны; два пути не эквивалентны. Многопоточность нельзя использовать для одновременного выполнения нескольких инструкций Python. В лучшем случае у вас будет несколько потоков, борющихся за процессорное время на одном ядре, что может привести к задержке при нагрузке. Вместо этого вы можете вернуться к многопроцессорной обработке, выяснить, что конкретно вызывает повторяющееся поведение, и переместить эту часть (или весь нефункциональный код верхнего уровня) в проверку if __name__ == "__main__", поскольку __name__ будет отличаться в порожденный процесс.

Carcigenicate 25.12.2020 18:56

@Carcigenicate Обязательно постараюсь найти ошибку. Однако, поскольку документы PyWebview указывают, что многопоточность лучше использовать с их модулем, то это то, к чему я сейчас перешел. Большое спасибо за подсказку!

arthem 25.12.2020 19:45

Другие вопросы по теме