如何解决如何在Python中的单独线程中启动Flask API服务器
我正在研究一个Python项目,该项目包括基于pyqt5
和flask
的API。在用户界面中,有start
和stop
按钮,当它们按下时将启动flask
api服务器,并在单击停止按钮时停止。
from server import start_local_server
from multiprocessing import Process
"""
SOME CODE
"""
def start_server_btn_event(self):
p1 = Process(target=start_local_server())
p1.start()
def stop_server_btn_event(self):
# Code to stop the api server
但是,执行上述操作会使整个UI失去响应,并且我无法单击UI上的任何其他对象。如何在单独的线程或进程中单击按钮时运行api服务器,以便其他UI对象处于活动状态并可以执行其功能。谢谢
最小可复制示例:
app.py:其中包含pyqt5按钮,用于启动本地服务器
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QPushButton
from server import start_local_server
from PyQt5.QtCore import pyqtSlot
from multiprocessing import Process
class App(QWidget):
def __init__(self):
super().__init__()
self.title = 'PyQt5 button - pythonspot.com'
self.left = 10
self.top = 10
self.width = 320
self.height = 200
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(self.left,self.top,self.width,self.height)
start_btn = QPushButton('Start Server',self)
start_btn.move(100,70)
start_btn.clicked.connect(self.on_click_start_btn)
stop_btn = QPushButton('Stop Server',self)
stop_btn.move(200,70)
stop_btn.clicked.connect(self.on_click_stop_btn)
fun_btn = QPushButton('Click to check responsiveness',self)
fun_btn.move(150,100)
fun_btn.clicked.connect(self.on_click_fun_btn)
self.show()
@pyqtSlot()
def on_click_start_btn(self):
# Start server here
p1 = Process(target=start_local_server())
p1.start()
@pyqtSlot()
def on_click_stop_btn(self):
print("Stop server ")
@pyqtSlot()
def on_click_fun_btn(self):
print('If it is working,this means UI is responsive')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
server.py:这是Flask API服务器代码
import os
import datetime
from flask import Flask,jsonify
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
wsgi_app = app.wsgi_app
@app.route('/api/status')
def check_status():
return jsonify({'status': 'ok','date': datetime.datetime.now().isoformat()}),200
def start_local_server():
HOST = os.environ.get('SERVER_HOST','localhost')
try:
PORT = int(os.environ.get('SERVER_PORT','5555'))
except ValueError:
PORT = 5555
app.run(HOST,80)
解决方法
我通过启动一个单独的线程来运行API服务器来解决该问题:
run = True
def start_api_server():
while run:
start_local_server()
time.sleep(1)
print("SERVER HAS STOPPED")
@pyqtSlot()
def on_click_start_btn(self):
Thread(target=start_api_server).start()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。