Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我的项目应该使用线程多处理还是asycio?_Python_Multithreading - Fatal编程技术网

Python 我的项目应该使用线程多处理还是asycio?

Python 我的项目应该使用线程多处理还是asycio?,python,multithreading,Python,Multithreading,我试图建立一个温度控制模块,可以通过网络控制或手动控制。我的程序的各个部分都可以工作,但我很难弄清楚如何让它们一起工作。另外,我的温度控制模块是python,客户端是C# 就物理元件而言,我有一个设置温度、打开和关闭加热器的键盘,还有一个显示温度数据的lcd屏幕,当然还有一个温度传感器 对于我的网络内容,我需要: 不断向客户端发送温度数据。 向客户端发送日志文件列表。 等待客户端的提示,设置所需温度或向客户端发送日志文件 到目前为止,所有硬件工作正常,网络功能的每个单独部分都可以工作,但不能一起

我试图建立一个温度控制模块,可以通过网络控制或手动控制。我的程序的各个部分都可以工作,但我很难弄清楚如何让它们一起工作。另外,我的温度控制模块是python,客户端是C#

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

对于我的网络内容,我需要: 不断向客户端发送温度数据。 向客户端发送日志文件列表。 等待客户端的提示,设置所需温度或向客户端发送日志文件

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

我一直在尝试使用线程,但不知道我是否应该使用其他东西

编辑: 以下是我想做的事情背后的基本逻辑:

硬件:

键盘接收一个数字输入,直到“*”,然后设置一个临时变量

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

“#”转动加热器并将温度变量设置为0

温度变量不为0时,传感器数据写入日志文件

网络:

客户端连接后,会向客户端发送日志文件列表

温度传感器数据连续发送至客户端

提示处理程序侦听提示

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

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

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


来自键盘或客户端的命令应始终有效。

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

编辑:这看起来像是一个相当复杂的项目,所以不要期望它在你第一次点击“run”时就能完美运行,但肯定是非常可行和有趣的

下面是我将如何组织这个项目

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

  • 我会有一个线程作为您的温度控制器(PID控制/任何)有加热器输出的唯一控制。(其他线程请求更改设定点/控制模式(占空比/PID))

  • 我将有一个主线程(带有几个dameon线程)来处理数据记录:main thead侦听记录命令(暂停、恢复、获取等)。dameon线程用于轮询温度计、旋转日志文件等

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

  • 最后,对于键盘输入,我可能只需要编写一个快速的
    tkinter
    应用程序来抓取按键,因为这就是我所知道的。同样,使用tkinter应用程序生成请求,但不要直接修改值;在线程之间“交谈”时使用getter和setter。它只是让事情更好地组织和划分


  • @drako234也许您可以编写一些伪代码或绘制子系统的图表,然后我可以尝试将哪些线程分配给各种任务。这在很大程度上是一个“细节中的魔鬼”问题,因此我认为解决这个问题的一个很好的方法是绘制一个框架图,其中包含所有需要工作的各个组件together@drako234我添加了一些更具体的实施建议。。您肯定可以在第一次迭代中减少一些复杂性,以使其更易于管理(我将首先简化您的日志记录情况)。保持独立线程如此隔离(使用getter和setter)的部分好处是,修改单个组件更容易,而不会影响其他组件。