【问题标题】:Python: Multi-threading or Loops?Python:多线程还是循环?
【发布时间】:2018-08-07 17:22:02
【问题描述】:

我想知道使用多线程的想法在光强度传感器和运动传感器之间执行信息共享是否可行。我正在做一个项目来自动化房间环境中的照明质量。 (我是编程初学者,如果有任何反馈,我将不胜感激!)

我现在开始的方式只是用简单的数字条件测试代码并打印语句。下面是项目的模拟代码。

x=1 #set simply to say some is enters room

def MotionSenseLeave(x):

    x=0
    if x==0:
        print("3. Someone left")           #Wait for someone to leave by checking condition
        LightSense()
    else:
        x==0
    return x 

def LightSense():

    #Turn on lights
    if x==1:               #and light quality is above/below a value#
        print("2. Adjust Light")    #Measure Light Quality
        MotionSenseLeave(x)
    elif x==0: 
        print("Stop operation, the person left")
        MotionSenseEnter(x)
    elif x==1:          #and light is close to value
        print("Light quality sufficent, no changes needed")
        MotionSenseLeave(x)

def MotionSenseEnter(x):

    while x!=1:
        if x==1:
            print("1. Someone here")           #Wait for someone to come in
            LightSense()
        else:
            x==0
    return x   

MotionSenseEnter(x)                           #begin operation

基本上,操作从 MotionSenseEnter() 开始,并等待进入条件或 x=1(在这种情况下,我只是在开始时将其设置为 1)。如果有人进入,然后转到 LightSense(),打开灯,然后案件开始,在每个案件之后我运行 MotionSenseEnter() 或 MotionSenseLeave() 函数来查看该人是否进入/离开以关闭/关闭系统和从头开始重新启动,直到检测到条目。

我想知道将这些进程多线程化是否更有效。如果是的话,我想我得先检查是否有人进入房间,然后多线程离开条件和灯光监控条件继续操作或关闭它并再次等待进入。如果有人对此有任何意见,欢迎所有反馈。同样,我是编程初学者,我很欣赏所有想法,但简单的想法最适合我!

【问题讨论】:

  • Python 通常不适合多线程应用程序。见here
  • @SanchitAnand 这不是您需要出色性能的情况。额外的价值来自交错执行和在 IO 操作发生时做一些事情。 Python 很好。
  • Python 中的线程存在混淆,因为最常见的解释器实际上并没有并行执行它们。您可以使用 Python 中的 multiprocessing 模块充分利用多个 CPU 内核并在 进程(而不是一个进程中的线程)之间轻松通信。然后,它的用法与您在 C 或 Rust 中可能习惯的多线程相似。虽然我建议使用比 Python 更合适的语言来进行性能感知的多线程计算。我想说这在那个领域非常笨拙且不可预测。

标签: python multithreading loops if-statement conditional


【解决方案1】:

这取决于您如何从传感器获取信息以及调整光线的含义。

您正在执行control system,这通常意味着您想要为您的操作绘制和实现state machine。 你想要像“关灯”、“开灯”这样的状态,并且你的事件是“检测到运动”、“运动停止”——也许还有一些额外的定时器状态,这样如果有人站着不动,你就不会闪烁灯。

根据您的输入,您必须:

  • 从您收到的推送事件中驱动它
  • 循环,从传感器轮询信息

其中任何一个都不需要多线程。它可能有用的是驱动灯:如果您希望它们加速而不是立即打开,您可能需要一个单独的线程来随着时间的推移调整灯以达到状态机预期的水平。

基本系统应该可以在没有任何多线程的情况下实现。你需要一些事件处理才能有一个定时事件。 (在 X 秒不活动后关灯)

在您的伪代码中,您目前有一个无限递归,这是您绝对不想要的。

【讨论】:

  • 很好的答案。有限状态机最终使事情变得比人们想象的要容易得多。
猜你喜欢
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多