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

news2024/10/11 18:09:54

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

新增 /lib/PlcReader.py

# 执行 PLC 读取类
# 读取 PLC 配置文件
# 定时(每秒)读取PLC值,发送到内存模块中,并通过 WebSocket 发送给所有连接客户端

import time

class PlcReader(object):
    def __init__(self, job_name):
        self.jobName = job_name
        self.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("如有没有读取配置列表")
            return
        print("去更新内存中的PLC值,并通过WebSocket发送给所有连接客户端")

新增/lib/ProcessTester.py

# 工艺测试主程序
# 提供初始化工艺
# 提供开始执行
# 提供暂定执行
# 提供结束执行(紧急停止可调用)
# 提供手动调节
# 对外提供 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"))
        return

    def 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"))
        return

class ProcessTester:
    def __init__(self, port):
        self.handler = HTTPRequestHandler
        self.port = port

    def start(self):
        with socketserver.TCPServer(("", self.port), self.handler) as httpd:
            print("HTTP 服务启动在端口", self.port)
            httpd.serve_forever()

/lib/WebSocketServer.py

import tornado.web
import tornado.httpserver
import tornado.ioloop
import tornado.websocket

class 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 True

class WebSocketServer:
    def __init__(self, port):
        self.port = port
    def 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

# 启动三个线程
# 1. PLC读取模块
# 2. 执行工艺试验模块
# 3. WebSocket通讯模块


import threading
import time

from lib.PlcReader import PlcReader
from lib.ProcessTester import ProcessTester
from lib.WebSocketServer import WebSocketServer


plcReader = 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.coloradmin.cn/o/2205423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零样本主题驱动图像生成新方法!EZIGen:在保持灵活性的同时保留主题身份!

今天给大家介绍一个零样本主题驱动图像生成方法EZIGen,它会从你提供的主体图像中提取出重要特征,就像是给图像做一个“身份识别”,确保生成的新图像能够保留主体的独特特征。接下来,EZIGen会根据你输入的文本提示,生成…

怎么高效恢复硬盘和u盘里的数据:全面指南

在数字时代,数据已成为我们生活与工作中不可或缺的一部分。无论是个人珍贵的照片、视频,还是企业至关重要的文档、项目资料,一旦硬盘或U盘中的数据丢失,都可能带来不可估量的损失。幸运的是,随着技术的发展&#xff0c…

.Net基础1

.NET框架 项目结构 Connected Services是第三方服务MVC框架appsettings.json配置文件Program.cs控制台应用程序Properties里的json文件是配置启动方式 1. 基本开发 出现这个bug是因为防火墙没有把浏览器加入白名单,可以暂时先用http启动代替 第一步创建控制器&am…

希亦超声波清洗机是智商税吗?百元级超声波清洗机旗舰机皇真相大揭秘!

在深入探讨这个问题之前,我们先来了解一下超声波清洗机的工作原理。超声波清洗机利用高频振动波,通过液体介质传递能量,产生无数微小的气泡。这些气泡在压力作用下迅速闭合,形成强大的冲击波,能够深入清洁物品表面难以…

苹果秋季盛典:iPhone 16系列引领未来科技潮流

9月10日,苹果公司在众人瞩目中举办了2024年的秋季特别活动,发布了备受期待的iPhone 16系列。 尽管网络发布会已经持续了一整年,但熬夜观看的果粉们仍然热情不减,因为每一次苹果的新品发布都代表着科技界的一次重大飞跃。 iPhone …

汽车销量预测系统

项目介绍 此项目服务于汽车经销商、汽车生产商,旨在成为用于使企业充分了解消费者诉求,预见市场未来的需求量和可能存在的销售变化趋势,合理规划产能,正确制定生产计划,实施以销定产的生产策略的交流平台,…

应对专利过期的有效方法与补救措施

专利作为创新成果的重要保护手段,在一定期限内为所有者提供了独家的权利。然而,当专利过期时,情况会变得较为复杂,需要采取不同的应对方法,以下将分别针对忘记缴纳年费以及保护期限届满这两种常见情况进行要点解析。 一…

100V调光芯片SL8701 支持PWM/模拟调光 无频闪 多路共阳 高辉度65536级

一、产品概述 SL8701是一款内置100V MOS的降压型高调光比LED恒流驱动芯片,专为智能调光调色照明研发设计。它支持多种调光方式,包括PWM调光、模拟调光等,能够实现高调光比,满足不同场景的照明需求。 二、主要特点 高效降压&…

银行流水获取方式(二)

银行流水获取方式 摘要: 本文探讨了银行流水在企业财务管理中的重要性及其获取方式。银行流水是企业财务活动的关键记录,涵盖了所有资金流动情况,对日常运营、财务管理、税务申报和审计至关重要。企业通过核对银行流水确保账务准确性&#…

软测实验:熟悉功能测试工具

实验背景:理解自动化测试原理和方法,熟悉功能测试工具的使用。 实验目的: 熟悉功能测试工具的基本使用方法熟悉功能测试的基本流程能够根据测试结果撰写测试报告 一、测试需求 自动化测试原理是通过使用自动化测试工具和脚本来模拟人工测…

python 共享内存(注册、写入、读取)

import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from UI.ui_shareMmap import Ui_ShareMServiceDlg # 导入UI类 import mmapclass QMainDialog(QDialog, Ui_ShareMServiceDlg): # 修改点(UI类)def __init__(self, parentNone):…

数据库文档编写流程

在一个系统中新增一个模块,通常不是一个人能够独立完成的。这需要多个团队甚至两个组的共同合作。例如,如果我们想在设备管理系统中添加一个IT资产管理模块,领导不会简单地说:“喂,你给我加一个IT资产管理模块。”直接…

如何做独立站将产品卖到国外?从零开始打造你的全球电商帝国

近年来,跨境电商发展迅猛,为卖家提供了广阔的市场空间。相比于传统跨境电商平台模式,独立站模式拥有更大的自主权和灵活性,卖家可以打造专属的品牌形象,并根据自身需求定制营销策略。 如果你也想通过独立站将产品卖到…

在培训考试小程序页面弹出半屏的弹窗交互实践

如果在页面内进行复杂的界面设计(如在页面内弹出半屏的弹窗、在页面内加载一个全屏的子页面等),用户进行返回操作会直接离开当前页面,不符合用户预期,预期应为关闭当前弹出的组件。 为此提供“假页”容器组件page-con…

python爬虫 - 深入正则表达式

🌈个人主页:https://blog.csdn.net/2401_86688088?typeblog 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、匹配多个字符 (一)匹配任意多个字符 &#xff0…

Java学习-JVM

目录 1. 基本常识 1.1 JVM是什么 1.2 JVM架构图 1.3 Java技术体系 1.4 Java与JVM的关系 2. 类加载系统 2.1 类加载器种类 2.2 执行顺序 2.3 类加载四个时机 2.4 生命周期 2.5 类加载途径 2.6 双亲委派模型 3. 运行时数据区 3.1 运行时数据区构成 3.2 堆 3.3 栈…

adaptor lora基础

https://www.zhihu.com/question/508658141/answer/3340979311 adaptor和PEFT的区别:前者在模型子层后加一个小型的dense;后者直接稀疏化模型本身; Loading Pre-Trained Adapters — AdapterHub documentation CVPR 2024 | SD-DiT&#xff…

五分钟带你零基础入门跨境电商独立站,干货速递!

对于跨境电商卖家来说,多平台、多站点的布局是非常重要的战略。这样做可以规避”鸡蛋放在同一个篮子里”的风险也能够追求更高的销售额和利润。同时,市场的变化也带来了新的发展机会,因此很多出海企业都希望抓住独立站的新机遇,抢…

什么因素能冲击实时现货黄金价格?

实时现货黄金价格怎样走,投资者关键要看全球通胀、经济增长、美联储货币政策和全球央行需求这些基本面的因素。在全球货币体系“去美元化”趋势越来越明晰的当下,黄金在国际储备中的地位将逐步上升——在尚未出现可取代美元的货币之前,黄金独…

电机是怎么转起来的?

世界上功率消耗量的近一半是由电机消耗,因此在解决世界能源问题上,电机的高效率化被称为是最有效的措施。 电机种类 一般情况下指将磁场内电流流通产生的力转变为旋转动作,在广义范围内还包括直线动作。 按电机驱动的电源种类,…