我正在尝试使用网络服务器让树莓派控制可寻址的 LED 灯带。因为我无法转发端口,所以网络服务器托管在 python 上的任何地方,并且 pi 不断发送 get 请求以查看是否需要更改照明。
某些灯光效果将有自己的计时,并且需要自行循环,例如彩虹效果,它将以 10Hz 循环并更新 LED 颜色。如何让脚本更新 LED 颜色,同时还必须发送获取请求? get 请求相对较慢,因此将它们放在同一个循环中似乎不是一个可行的选择。
编辑: 感谢您的回复。原来我正在寻找异步编程。
最佳答案
您可以使用 asyncio 非常简单地完成此操作。请注意,为了执行网络请求,您还应该使用异步库,例如 aiohttp 。否则,阻塞的 http 调用将延迟其他任务的运行。
下面是一个示例,其中您使用上下文对象来允许在不同任务之间共享数据。这两个任务都需要有一些 await
调用,这允许 asyncio 在正在运行的任务之间切换以实现并发。
import asyncio
class Context:
def __init__(self):
self.message = 0
async def report(context):
while True:
print(context.message)
await asyncio.sleep(1)
async def update(context):
while True:
context.message += 1
await asyncio.sleep(3)
async def main():
context = Context()
await asyncio.gather(report(context), update(context))
if __name__ == "__main__":
asyncio.run(main())
关于Python 脚本同时执行多项操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71581123/