如何从另一个 multiprocessing.Process 访问 pywebview.Window 对象?

How to Access pywebview.Window Object from Another multiprocessing.Process?

我有一个 webview 控制 flask api。

Web 视图将有一个启动 flask server 的按钮和一个停止服务器的按钮。这就是为什么我必须使用 multiprocessing.ProcessFlask 创建一个单独的进程。这样,我就不能再访问我的 pywebview.Window 了。我想在 Flask 过程中使用 pywebview.Window 评估一些 javascript 和 pywebview.Window.evaluate_js() (当然它必须与我之前创建的 pywebview.Window 相同为 Flask 打开一个新进程)。 有谁知道如何解决这个问题。我很感激!

一些示例代码:

from flask import Flask, request, jsonify
import os, sys, re, json, socket, sqlite3, base64, requests, webview
from flask_cors import CORS

class ServerFlaskApi:
    def __init__(self):
        self.app = Flask(__name__, root_path=Root_Dir)
        self.app.add_url_rule("/", view_func=self.Default)

    def Default(self):
        return "Welcome to the Python Http Server for your Application!", 200
    def PrintToWebViewConsole(self):
        #Trying to use pywebview.Window here, of course WebviewWindow is not defined!!!
        WebviewWindow.evaluate_js(js_script)
################
class WebviewApi:
    def __init__(self):
        self.server_thread = None
    def StartServer(self):
        self.server_thread = multiprocessing.Process(target=Run_Flask_Server, daemon=True)
        self.server_thread.start()
    def StopServer(self):
        self.server_thread.terminate()

def Run_Flask_Server():
    serverApi = ServerFlaskApi()
    CORS(serverApi.app)
    serverApi.app.run(host=Server_Host, port=Server_Port, debug=True, use_reloader=False)
################
if __name__ == "__main__":
    WebViewApi = WebviewApi()
    WebviewWindow = webview.create_window(title="Server Monitor", url="view/main-gui.html", js_api=WebViewApi, width=550, height=750, min_size=(550, 750), resizable=False, on_top=True, confirm_close=False)
    webview.start(debug=False)

我在 Python 还是新人,所以欢迎任何建议!

提前致谢!

我想我必须使用 Threading 而不是 Processing,因为 Thread 是共享内存而 Process 不是。 另外,对于任何想要停止 Thread 的人来说,这里有一个函数可以做到这一点,不确定这是否是一个好方法,但它对我有用:

def Kill_Thread(thread):
    if not isinstance(thread, threading.Thread):
            raise TypeError("Must be set as threading.Thread type!!!")
    thread_id = thread.ident
    res = ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, ctypes.py_object(SystemExit))
    if res > 1:
        ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, 0)
        print("Exception raise failure")