我应该为我的项目使用线程多处理或asycio吗?

时间:2017-06-22 14:59:25

标签: python multithreading

我正在尝试构建一个可通过网络或手动控制进行控制的温度控制模块。我的程序的各个部分都工作但我无法弄清楚如何使它们一起工作。我的温度控制模块是python,客户端是C#。

就物理组件而言,我有一个设置温度并打开和关闭加热器的键盘和一个显示温度数据的LCD屏幕,当然还有温度传感器。

我需要的网络资料: 不断向客户发送温度数据。 将日志文件列表发送到客户端。 等待客户端提示设置所需的温度或将日志文件发送给客户端。

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

我一直在尝试使用线程,但是想知道我是否应该使用别的东西?

编辑: 这是我想要做的基本逻辑:

设备:

键盘输入一个数字,直到'*'然后设置一个临时变量。

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

'#'转动加热器并将temp变量设置为0。

传感器数据写入日志文件,而临时变量不是0

网络:

在客户端连接时,客户端会发送一个日志文件列表

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

提示处理程序侦听提示。

如果客户请求日志文件,则暂停温度数据,然后发送文件,然后恢复温度数据。

客户端可以向提示处理程序发送命令以设置temp变量以触发加热器

客户端可以向提示处理程序发送命令以停止加热器并将temp变量设置为0

来自键盘或客户端的

命令应该始终有效。

1 个答案:

答案 0 :(得分:1)

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

编辑:这看起来像是一个相当复杂的项目,所以当你第一次点击"运行"时,不要期望它完美无缺,但绝对非常可行和有趣。

这是我如何构建这个项目...

我在这里看到了四个独立的线程(对于愚蠢的小任务,可能是小的辅助dameon线程)

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

  2. 我会有一个主线程(有几个dameon线程)来处理数据记录:主要的thead监听记录命令(暂停,恢复,获取等)dameon线程来轮询温度计,旋转日志文件等等。

  3. 我对网络不熟悉,这将特定于您的客户端应用程序,但我可能会开始使用http.server仅用于原型设计,或者类似于websockets和一点asyncio。主要的是它会与数据记录器和温度控制器线程进行交互,而不是直接修改值

  4. 最后,对于键盘输入,我可能只是编写一个快速tkinter应用程序来抓取按键,因为这就是我所知道的。再次,使用tkinter应用程序形成请求,但不要直接修改值;当"说话"时使用getter和setter线程之间。它只是让事情更好地组织和划分。