我尝试编写一个python-parent-script,它从4个子脚本中收集数据。我得到了什么:
每个子脚本都从不同的传感器读取数据,必须连续读取。所以我现在所做的就是在True循环中读取它们。
不同的传感器具有不同的响应时间,因此一个子脚本使用a读取,比如一次一次读取,而另一个则读取速度提高100倍。
我的目标/我的奋斗:
我还有什么想法:
子脚本在那里工作正常并且没有问题地阅读数据
我可以从终端启动所有4个子脚本作为子进程,但不知道如何收集生成的数据
在脚本之间传递数据,但从不同时从两个脚本传递数据以及减慢速度,因为'from script import variable'与读取传感器的速度一样快。
后来的计划是通过蓝牙将这4个变量发送到我的手机,只有一个传感器我已经成功了。
由于我对整个Raspberry / Python社区都很陌生,所以我首先会对非特异性的扩展表示抱歉。请随时询问进一步的信息或建议以不同的方式解决问题。如果你愿意的话,如果你可以帮助我使用代码片段,那么我会很多地接受它,因为我再次感到很新,这有助于我提供更多关于图书馆或文档的链接,这些文档会产生更多问题而不是回答它们。
提前多多谢谢你
答案 0 :(得分:0)
实现这一目标的最简单方法是使用threading class提供的线程。收集数据就像写入共享变量一样简单(当然,线程安全)。
import threading
import time
data1 = []
lock1 = threading.Lock() # Use a lock, mutex, or semaphore to ensure thread safety
def foo():
while True:
lock1.acquire()
data1.append(bar)
lock1.release()
time.sleep(10)
foo_thread = threading.thread(target=foo)
foo_thread.start()
while True:
lock1.acquire()
# If all values don't need to be held in memory the parent
# script can implement some kind of queue and delete values
# after processing
do_stuff_with(data)
lock1.release()
# Queuing also allows the parent script to run at a much slower rate
time.sleep(100)
上面的示例是一个非常快速的线程演示。有更好的数据类型来实现排队,例如collection.deque。
python中的线程确实有一些注意事项,即python在一个进程中运行脚本,并且有一个Global Interpreter Lock,这意味着线程模块提供并发性,但不提供并行性。对于仅4个数据集合,它可能会导致任何问题,但如果需要更好的性能multiprocessing提供了生成多个python进程的工具,允许真正的并行性。