python - 如何使用 Python Threading 在线程之间传递参数?

标签 python multithreading sockets udp

1.
总结问题

我正在使用 Python 2 和运行 Raspbian Buster 的 Raspberry Pi 4。试图限制我的程序从使用套接字通过 UDP 连接发送其数据的 Android 设备读取传感器数据的速度。 IE:我将其构建为一个小型激光绊线应用程序,并且开始时,我想在每次传感器值降至某个数字以下时增加一个计数累加器,表明激光绊倒。但是,数据读取速度如此之快,以至于每次传感器水平下降时,计数都会增加很多次。我怎样才能每 X 秒读取一次 UDP 数据?
2.
描述你尝试过的

  • 我试过 time.sleep() 但从我读过的内容来看,这是一个阻塞函数,经过测试,它确实阻止了我的程序能够通过 UDP 套接字更新传感器数据
  • 我尝试过线程,但我无法弄清楚如何将传感器数据从一个线程传递到另一个线程。
  • 我研究了 join() 但遇到的技术文档对初学者不太友好。
  • 这里的一些帖子建议设置客户端/服务器接口(interface),但我也不知道该怎么做。

  • 3.
    适当时,显示一些代码

    这是我目前在线程解决方案方面的进展。我正在使用名为 SensorUDP 的 Android 应用程序,并且在环境光传感器打开并激活发送数据的情况下,该程序将读取 UDP 数据并打印它。即使没有 UDP 数据,它仍然会运行计数线程。
    import socket
    from struct import *
    import time
    import threading
    
    #We have 0-92 over a 1024 byte buffer representing distinct
    #sensors being sent over UDP from my android smartphone
    #this test program im only pulling byte 56 for Ambient Light sensing
    #a laser shining into my phones sensor has 30,000-50,000 lums so anything
    #less then that range must mean the laser was tripped
    
    
    #UDP = SOCK_DGRAM, AF_INET = Internet
    UDP_IP = "192.168.1.149" #my rpi4 address
    print "Receiver IP: ", UDP_IP
    UDP_PORT = 5000 #arbitrary for now but needs to match my androids broadcast
    print "Port: ", UDP_PORT
    sock = socket.socket(socket.AF_INET, # Internet
                        socket.SOCK_DGRAM) # UDP
    sock.bind((UDP_IP, UDP_PORT)) #complete the binding
    
    running = True
    count = 0
    laserOn = 1000 #using a low lums to test so I dont have to use laser every time
    aLight = 0
    result_available = threading.Event() #.set() this when the data is recieved
    threadTimer = 5
    
    def calcAmbLight():
    
    # Continuously read from the UDP socket
       
        while running:
           
            data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
            #the data from the app Im using to push the sensor data needs to
            #be unpacked
            aLight = "%.1f" %unpack_from ('!f', data, 56)
            print ("Ambient Light = ", aLight)
    
    def displayCount():
        count = 0
        while running:
            time.sleep(1)
            #how to pass aLight into this thread from the other thread?
            if aLight < laserOn:
                count = count + 1
    
            print("Current aLight: ",aLight)
            print("Current Count: ", count)
           
    if __name__ == '__main__':
                  
        #create a basicthread to run calcAmbLight
        calcAmb = threading.Thread(target= calcAmbLight)
        calcAmb.start()
       
        dispCount = threading.Thread(target = displayCount)
        dispCount.start()
    

    最佳答案

    当前设置的问题是由于您没有声明 aLight作为全局 calcAmbLight() .将其声明为全局变量应该允许它工作。

    def calcAmbLight():
        global aLight  # Set the global aLight, instead of a local stack variable
    
        while running:
    
            data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
            #the data from the app Im using to push the sensor data needs to
            #be unpacked
            aLight = "%.1f" %unpack_from ('!f', data, 56)
            print ("Ambient Light = ", aLight)
    

    关于python - 如何使用 Python Threading 在线程之间传递参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62034338/

    相关文章:

    multithreading - future 与线程 : Which is better for working with channels in core. 异步?

    python - 通过套接字发送pil图像而不保存python

    python - BeautifulSoup 中的 selfClosingTags

    python - PyPDF2 在打开不安全文件时是否采取任何安全措施?

    python - 在 Python 2.7 中分割字符串

    multithreading - 在 Haskell 中创建 100 万个线程需要多长时间?

    python - 如何根据特定列表计算频率?

    multithreading - Phonegap "[' Media'] 插件应该使用后台线程。”

    python - 多线程 TCP 套接字

    c# - 怎么比较ip地址