2017-06-22 29 views
1

我正在尝试构建一个可以通过网络或手动控制进行控制的温度控制模块。我的程序的各个部分都可以工作,但我无法弄清楚如何使它们一起工作。我的温度控制模块是python,客户端是C#。我应该为我的项目使用线程多处理还是asycio?

至于物理组件去了我有一个键盘,设置温度和打开和关闭加热器和一个液晶屏幕,显示温度数据,当然还有一个温度传感器。我需要: 不断发送温度数据到客户端。 将日志文件列表发送给客户端。 等待来自客户端的提示,以设置所需的温度或向客户端发送日志文件。

到目前为止,所有硬件都正常工作,网络功能的每个单独部分都可以工作,但不能在一起工作。我还没有尝试过使用物理和网络组件。

我一直在尝试为此使用线程,但想知道如果我应该使用别的东西?

编辑: 这里是背后究竟我想要做的基本逻辑:

硬件:

键盘需要花费数输入,直到“*”它会设置一个临时变量。

将温度变量与传感器数据进行比较,并相应地打开或关闭加热器。

“#”接通加热器的并设置临时变量为0。

传感器数据被写入到日志文件而临时变量不为0

网络:

在客户端连接客户端发送日志文件列表

温度传感器数据不断发送到客户端。

提示处理程序侦听提示。

如果客户端请求日志文件,温度数据被暂停,并且文件发送之后温度数据被恢复。

客户端可以发送命令到提示处理程序来设置的临时变量来触发加热器

客户端可以发送命令到提示处理程序,以停止所述加热器,并设置临时变量为0

命令从键盘或客户端应始终工作。

回答

1

多处理通常用于希望利用多处理内核的计算能力。多处理限制了您如何处理程序组件之间共享状态的选项,因为内存最初是在进程创建时复制的,但不会自动共享或更新。线程从相同的内存区域执行,并且没有此限制,但无法利用多个内核来提高计算性能。您的应用程序听起来并不像需要大量计算,并且只需从并发中受益,以便能够同时处理用户输入,网络连接和少量处理。我会说你需要线程而不是进程。我对asyncio的经验不足,无法与线程进行比较。

编辑:这看起来像一个相当复杂的项目,所以不要指望它第一次打到“跑步”时就完美了,但绝对是非常可行和有趣的。

下面我将如何构建这个项目......

我看到有效的四个独立的线程在这里(为愚蠢的小任务,也许小配套dameon线程)

  1. 我将有一个线程充当你的温度控制器(PID控制/任何),只有加热器输出的唯一控制。 (其他线程可以请求更改设定值/控制模式(占空比/ PID))

  2. 我将有一个主线程(带有几个dameon线程)来处理数据记录:Mainad接受日志记录命令(暂停,恢复,获取等)dameon线程轮询温度计,旋转日志文件等。

  3. 我不是很熟悉网络,这将是特定于您的客户端应用程序,但我可能012ff只适用于原型开发,或者可能是websocketsasyncio的一小部分。最主要的是,它会与getter和setter方法,而不是直接修改值

  4. 最后的数据记录仪和温度控制器线程交互,为键盘输入,我很可能只是做了一个快速tkinter应用抢按键,因为这就是我所知道的。再次,使用tkinter应用程序形成请求,但不要直接修改值;线程之间“交谈”时使用getters和setter。它只是让事情更好地组织和划分。

+0

感谢您的意见。 – drako234

+0

@ drako234也许你可以写一些伪代码或者绘制你的子系统图,然后我可以试试我可以分配给不同任务的线程。这是一个“魔鬼在细节”问题,所以我认为一个很好的方法来处理它是你的个人组件框架的框图,所有需要一起工作 – Aaron

+0

是否足够的编辑? – drako234

相关问题