【问题标题】:Best way to respond quickly to a variable that is changed by another thread快速响应由另一个线程更改的变量的最佳方法
【发布时间】:2022-01-18 03:17:52
【问题描述】:

我编写了一个程序来使用每 10 毫秒通过 UDP 数据包发送给它的数据。我正在使用单独的线程,因为运行逻辑来处理数据可能需要不同的时间,如果超过 10 毫秒,我只希望它处理最近收到的数据报。我目前正在运行一个 while 循环,并通过 time.sleep(0.001) 每毫秒检查一次新报价。我刚刚了解到,在 windows server 2019 操作系统上处理这个 time.sleep() 实际上最多需要 16 毫秒,它会延迟一切。我可以只使用 pass 而不是 time.sleep ,但这最终会使用过多的 CPU(我正在运行该程序的多个实例)。有没有办法让程序暂停并在继续之前等待 maindata.newquote == True ?诀窍是我希望它能够非常快速地响应(不到一毫秒),而不是等待下一个 Windows 定时器中断。

class maindata:
  newquote = False
  quote = ''
  

def startquotesUDP(maindata,myaddress,port):
  UDPServerSocket = socket(family=AF_INET, type=SOCK_DGRAM)
  UDPServerSocket.bind((myaddress, port))  
  while True:
    bytesAddressPair = UDPServerSocket.recvfrom(bufferSize)
    #parse raw data
    maindata.quote = parsed_data
    maindata.newquote = True

threading.Thread(target=startquotesUDP,args=(maindata,address,port,)).start()

while True:
  if maindata.newquote == False:
    time.sleep(0.001)               #This is what I want to improve
  else:
    #process maindata.quote
    maindata.newquote = False

【问题讨论】:

  • 在线程之间使用双端队列?在消费线程中对信号量使用等待,并且馈送线程命中信号量? IE。避免 time.sleep()
  • 这能回答你的问题吗? How best to wake a sleeping Python thread?

标签: python python-3.x multithreading


【解决方案1】:

我的答案与上面的@balmy 相同,但我什至不会打扰信号量。

生产者只是写入队列

while True:
    result = ...
    queue.put(result)
    sleep as necessary

接收者可以通过做得到每一个结果

while True:
    result = queue.get()
    handle result

如果您只想查看生产者发送的最新结果,以防自上次查看以来它已发送多个结果,那么:

while True:
    result = queue.get()
    while not queue.empty():
        result = queue.get()
    handle result

【讨论】:

  • 我应该补充一点,当生产者领先于消费者时,您可以根据您希望发生的事情来做不同的事情。您还可以指定最大队列大小,因此如果生产者超前,生产者将阻塞。这一切都取决于你需要什么。
  • 这太完美了!响应时间几乎是瞬时的
  • @balmy 建议使用deque 而不是queue
  • @martineau。你说得对。他写“deque”,我读“queue”。这就是他想要一个信号量的原因。无论如何,我更喜欢使用更高级别的数据结构,并尽可能避免使用信号量和条件变量。
  • deques 是线程安全的。
猜你喜欢
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
相关资源
最近更新 更多