Python创建多个线程分别启动http、WebSocket服务

embedded/2024/10/15 17:26:08/
http://www.w3.org/2000/svg" style="display: none;">

我的计划是启动主程序后新建3个独立的线程,一个线程执行PLC读取,一个线程启动工艺测试(含http服务),另外一个线程启动WebSocket。

新增 /lib/PlcReader.py

python"># 执行 PLC 读取类
# 读取 PLC 配置文件
# 定时(每秒)读取PLC值,发送到内存模块中,并通过 WebSocket 发送给所有连接客户端import timeclass PlcReader(object):def __init__(self, job_name):self.jobName = job_nameself.readPlcValueConfigList = []def run(self):print("PLC读取模块启动")self.read_config()# 定时读取 PLC 的值while True:self.read_plc_value()time.sleep(1)def read_config(self):print("读取 PLC 配置文件")self.readPlcValueConfigList = [{"name": "aaa"}]def refresh_config(self):print("更新 PLC 配置文件")self.readPlcValueConfigList = []def read_plc_value(self):print("读取 PLC 值")# 如有没有读取配置列表,则不读取if not self.readPlcValueConfigList or len(self.readPlcValueConfigList) == 0:print("如有没有读取配置列表")returnprint("去更新内存中的PLC值,并通过WebSocket发送给所有连接客户端")

新增/lib/ProcessTester.py

python"># 工艺测试主程序
# 提供初始化工艺
# 提供开始执行
# 提供暂定执行
# 提供结束执行(紧急停止可调用)
# 提供手动调节
# 对外提供 http 调用服务,通过 http 调用来执行工艺的测试过程(初始化工艺、开始执行、暂停执行、结束执行、手动调节)import http.server
import socketserver
class HTTPRequestHandler(http.server.BaseHTTPRequestHandler):def do_GET(self):self.send_response(200)self.send_header('Content-type', 'text/html')self.end_headers()message = "Hello, World!"self.wfile.write(bytes(message, "utf8"))returndef do_POST(self):self.send_response(200)self.send_header('Content-type', 'text/html')self.end_headers()message = "Hello, World2!"self.wfile.write(bytes(message, "utf8"))returnclass ProcessTester:def __init__(self, port):self.handler = HTTPRequestHandlerself.port = portdef start(self):with socketserver.TCPServer(("", self.port), self.handler) as httpd:print("HTTP 服务启动在端口", self.port)httpd.serve_forever()

/lib/WebSocketServer.py

python">import tornado.web
import tornado.httpserver
import tornado.ioloop
import tornado.websocketclass WebSocketHandler(tornado.websocket.WebSocketHandler):def open(self):print('WebSocket opened')def on_message(self, message):print('WebSocket message received {}'.format(message))self.write_message(message)def on_close(self):print('WebSocket closed')def check_origin(self, origin):return Trueclass WebSocketServer:def __init__(self, port):self.port = portdef start(self):application = tornado.web.Application([(r'/websocket', WebSocketHandler)])http_server = tornado.httpserver.HTTPServer(application)http_server.listen(self.port)tornado.ioloop.IOLoop.instance().start()

最外层新增Main.py

python"># 启动三个线程
# 1. PLC读取模块
# 2. 执行工艺试验模块
# 3. WebSocket通讯模块import threading
import timefrom lib.PlcReader import PlcReader
from lib.ProcessTester import ProcessTester
from lib.WebSocketServer import WebSocketServerplcReader = PlcReader("PlcReader")
processTester = ProcessTester(8080)
wsServer = WebSocketServer(9001)if __name__ == "__main__":print("启动程序")# 创建线程对象thread1 = threading.Thread(target=plcReader.run)thread2 = threading.Thread(target=processTester.start)thread3 = threading.Thread(target=wsServer.start)# 启动线程thread1.start()thread2.start()thread3.start()time.sleep(10)plcReader.refresh_config()print("aaa")

编辑完了之后,启动Main.py


http://www.ppmy.cn/embedded/127979.html

相关文章

在 MoonBit 实现线段树(二)

引言 在上一篇文章当中我们讨论了最基础线段树的实现,但那棵线段树只能做到区间的查询(当然单点的修改与查询也是可以的),但做不到区间的修改(一个经典的应用是区间加法,即整个区间都加上某个值&#xff0…

Python入门笔记(七)

文章目录 第十五章. 下载数据15.1 csv文件15.2 json文件 第十六章. 使用API16.1 requests 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。 点击跳转:人工智能从入门到精通教程 本文电子版获取…

《Oracle DB备份与恢复》开篇:一切从Oracle Incarnation开始

题记:从本篇开始,我将为大家介绍Oracle DB备份与恢复。备份恢复是DBA的核心工作,重在实操,多加练习,模拟各种DB或实例崩溃的场景。不同于一些博主一出场就讲如何备份恢复,我将从备份的源头原理开始介绍。本…

Unite Shanghai 2024 技术专场 | Unity 6及未来规划:Unity引擎和服务路线图

在 2024 年 7 月 24 日的 Unite Shanghai 2024 技术专场演讲中,Unity 高级技术产品经理 Jeff Riesenmy 带来演讲 Unity 6 and Beyond: A Roadmap of Unity Engine and Services。作为本次 Unite 首场专题演讲,他介绍了 Unity 引擎的最新进展及其配套的工…

django urlconf反向解析

Django 的 URLconf 反向解析是指通过 URL 的名称(name 参数)来生成 URL,而不是在代码中硬编码 URL 路径。这种方式更加灵活,方便在 URL 结构发生变化时,只需要修改 URL 模式,而不必修改代码中的所有路径引用…

golang获取当天最小的时间,以DateTime的string格式返回

推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…

02.06、回文链表

02.06、[简单] 回文链表 1、题目描述 编写一个函数,检查输入的链表是否是回文的。 2、解题思路: 快慢指针找中点: 利用快慢指针的技巧来找到链表的中间节点。慢指针 slow 每次移动一步,而快指针 fast 每次移动两步。这样&…

React中useEffect钩子

副作用:渲染以外的操作:像后端获取数据、操作DOM参数:副作用方法、依赖(改变时重新执行)调用时间:渲染JSX之后/依赖改变 useEffect 是 React 中的一个 Hook,用于在函数组件中执行副作用操作。副…