在树莓派 pico W 上使用网络服务器线程时出现问题

问题描述 投票:0回答:1

我正在尝试让网络服务器在 pico 从某些引脚收集数据时显示一些数据。一切工作正常,使网络服务器运行,我能够使用“静态”数据访问它,但是事情变得棘手,必须循环定期收集数据并使网络服务器运行。 我尝试使用 _thread 库来实现这一点,就像我在许多教程/项目中看到的那样,并按以下方式测试它是否正常工作(剧透):

def serve(connection):
    while True:
        client = connection.accept()[0]
        try:
            html = webpage()
            client.send(html)
        except Exception as e:
            print(f"Error serving client: {e}")
        client.close()

...followed by all my methods for logic etc...

def GetSensorsValues():
    #Here should be all my data inputs stored locally/updated
    print('Test')

ip = connect()
connection = open_socket(ip)
_thread.start_new_thread(serve, (connection,))

while True:
    GetSensorsValues()
    sleep(5)

我不太明白的是,如果没有 _thread 中的调用,网络服务器可以正常工作,但线程化它是无法访问的。我可能会遗漏一些关于这个线程库如何工作的信息,我希望得到一些帮助...... 感谢您考虑我的请求!

python multithreading webserver raspberry-pi-pico
1个回答
0
投票

tl;dr:将其剥离到骨头,让线程工作,然后将其重新构建。

感谢您发布来源。 我在底部添加了一些代码审查。

引用你的参考文献

尝试实现......正如我在许多教程/项目中看到的那样

如果来源中有

#
评论将会很有帮助 代码提到了它所基于的教程的 URL。 正如所写,在我看来,OP 代码并不 应该可以工作,因为它似乎没有 与操作系统配合得很好。 通常我希望看到一个
class BackgroundLogging(Thread):
我们可以启动、运行,如果它退出的话还可以加入。

在源代码中提及文档 URL 也很有帮助。 我不能说我觉得这令人鼓舞:

https://docs.micropython.org/en/latest/library/_thread.html

该模块实现了多线程支持。

该模块是高度实验性的,其 API 尚未完全解决,本文档中尚未描述。

也许它应该不起作用?

我没有注意到其中有任何自动化测试,与某些测试不同 其他模块,例如

time
.

独立任务

您的代码具有三个循环任务:

  • 等待 HTTP 请求并发送 HTML 结果
  • 将新的温度读数附加到文件中
  • 打印“test”以表明我们还活着

鉴于目前“没有任何作用”, 我建议你缩小你的野心,直到你 有一些非常简单且有效的东西。 然后你可以慢慢地将它构建成更奇特的东西, 如果一些微小的添加设法破坏了东西,则暂停进行调试。 因此,开始一根红线、一根绿线和一根蓝线。 每个都会简单地打印颜色+时间戳, 短暂睡眠,然后循环重复。 不需要特殊的ADC硬件,所以你可以测试它 在您的笔记本电脑上,看看它是否工作,然后在 Pi 上进行测试,看看它是否工作。 我假设

ADC(4)

sensor.read_u16()
调用 “快”并且不会阻塞线程。 将它们替换为常数
0
然后恢复 原始调用将让您在测试期间验证这一点。
文件格式

您的代码成功运行一天后, 每次温度调查都必须写出 8640行温度数据,看起来像 8639行太多了。 我建议您放弃 JSON 格式并更喜欢

import csv

。 然后你可以附加一行并将其flush() 出来。

更好的方法是使用内置的 sqlite 数据库。
这样你就可以存储一年的读数,
并使用索引表快速获取今天的温度。

这里是一些不相关的代码审查。

您可以将

open_socket()

重命名为

open_web_socket()
路径库

def file_exists(filepath): try: os.stat(filepath) # Check if the file exists return True except OSError: return False

我们可以通过选择较新的来加强这一点
路径库

自 2022 年起可用。 from pathlib import Path def file_exists(filepath: str) -> bool: return Path(filepath).exists()

	
© www.soinside.com 2019 - 2024. All rights reserved.