从一个父脚本中的多个python脚本中收集变量

时间:2017-08-18 18:45:37

标签: python multithreading bluetooth multiprocessing collect

我尝试编写一个python-parent-script,它从4个子脚本中收集数据。我得到了什么:

  • 每个子脚本都从不同的传感器读取数据,必须连续读取。所以我现在所做的就是在True循环中读取它们。

  • 不同的传感器具有不同的响应时间,因此一个子脚本使用a读取,比如一次一次读取,而另一个则读取速度提高100倍。

我的目标/我的奋斗:

  • 在一个脚本中收集所有子生成的数据,包含4个不同的变量

我还有什么想法:

  • 子脚本在那里工作正常并且没有问题地阅读数据

  • 我可以从终端启动所有4个子脚本作为子进程,但不知道如何收集生成的数据

  • 在脚本之间传递数据,但从不同时从两个脚本传递数据以及减慢速度,因为'from script import variable'与读取传感器的速度一样快。

后来的计划是通过蓝牙将这4个变量发送到我的手机,只有一个传感器我已经成功了。

由于我对整个Raspberry / Python社区都很陌生,所以我首先会对非特异性的扩展表示抱歉。请随时询问进一步的信息或建议以不同的方式解决问题。如果你愿意的话,如果你可以帮助我使用代码片段,那么我会很多地接受它,因为我再次感到很新,这有助于我提供更多关于图书馆或文档的链接,这些文档会产生更多问题而不是回答它们。

提前多多谢谢你

1 个答案:

答案 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进程的工具,允许真正的并行性。