Flask Web服务器和TCP服务器同时运行

时间:2020-04-03 07:25:25

标签: python multithreading flask tcpserver

我刚刚通过Flask Framework构建了WebServer。在这个项目中,我创建了运行TCP Server的新线程。 该TCP服务器将在端口9999上侦听连接以从IED接收数据(温度值)。 这是我的Python代码

app = Flask(__name__)

BUFFER_SIZE = 1024
temp = 20
mutex = Lock()

def dbus_timer():
    print("Now Data Temp " + str(temp))

class WorkerSignals(QObject):
    finished = pyqtSignal(int)
    error = pyqtSignal(tuple)
    result = pyqtSignal(object)
    progress = pyqtSignal(int)

class Worker(QRunnable):
    def __init__(self, fn, *args, **kwargs):
        super(Worker, self).__init__()
        self.fn = fn
        self.args = args
        self.kwargs = kwargs
        self.signals = WorkerSignals()
        self.kwargs['progress_callback'] = self.signals.progress

    @pyqtSlot()
    def run(self):
        try:
            result = self.fn(*self.args, **self.kwargs)
        except:
            traceback.print_exc()
            exctype, value = sys.exc_info()[:2]
            self.signals.error.emit((exctype, value, traceback.format_exc()))
        else:
            self.signals.result.emit(result)  
        finally:
            self.signals.finished.emit(self.args[0])  

class StreamWorker(QtCore.QObject):
    def __init__(self, *args, **kwargs):
        super(StreamWorker, self).__init__()
        self.threadPool = QThreadPool()
        self.threadPool.setMaxThreadCount(1)
        self.TcpServerStart()

    def UpdateTemperatureSensor(self, bTxt):
        global temp
        _temp = int.from_bytes(bTxt, byteorder='big')
        if(_temp != temp):
            with mutex:
                temp = _temp
                print("\n Temperature: " + str(temp))

    def UpdatePotentinmeterSensor(self, txt):
        data = json.loads(txt)
        print(data["previous"])
        print(data["now"])

    def TcpServerListens(self, progress_callback):
        print("Start TcpServer")
        HOST, PORT = "192.168.0.88", 9999
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind((HOST, PORT))
        s.listen(1)
        sock, addr = s.accept()
        length = 0
        bReceive = b''

        while True:
            try:
                receiv = sock.recv(BUFFER_SIZE)
                if(receiv == b''):
                    break
                bReceive = bReceive + receiv
                if(len(bReceive) > 6):
                    bReceive = b''

                elif(len(bReceive) == 6):
                    bTxtHead = bReceive[0:2].decode("utf-8")
                    bTxtFooter = bReceive[4:6].decode("utf-8")
                    if (bTxtHead == 'AA' and bTxtFooter == 'FF'):
                        bTxt = bReceive[2:4]
                        self.UpdateTemperatureSensor(bTxt)
                        bReceive = b''
            except (errorCode, message):
                print(message + "aaaaa ")

    def TcpServerStart(self):
        worker = Worker(self.TcpServerListens)
        worker.signals.progress.connect(self.workProgress)
        self.threadPool.start(worker)

    def workProgress(self, n):
        print("done!!!!")

@app.route('/')
def index():
    with mutex:
        return 'Temperature is now ' + str(temp)

if __name__ == '__main__':
    tcpServer = StreamWorker()
    timer = multitimer.MultiTimer(interval=3, function=dbus_timer)
    timer.start()

    app.run(debug=True, host='0.0.0.0')

因此,当我从浏览器访问http://192.168.0.88:5000/时,温度值不变(仍等于初始值20)。我不知道为什么? 所以我尝试通过创建计时器并以interval = 3s读取它来测试温度值(查找) and that's result。因此,每隔3秒,它将同时打印:“现在数据温度280,现在数据温度20”

任何帮助将不胜感激!

0 个答案:

没有答案