首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:从多线程设置事件

Python:从多线程设置事件
EN

Stack Overflow用户
提问于 2017-08-31 02:44:04
回答 1查看 836关注 0票数 0

我有两个线程在监听两个不同的UART线路上的数据,它们可以在任何时候进入。我也有一个第三线程,这只是一个计时器。在我的主线程中,我希望等待这三个线程中的任何一个发出信号,以便触发解析数据和更新类型函数。

使用一个带有单独标志的事件,每个线程都会在设置事件之前设置,以表明它们中的哪一个触发了事件,这是一个可以接受的解决方案吗?或者有没有更好的方法来做到这一点,我错过了?

使用python 2.7

例如:

代码语言:javascript
复制
'''
UART RX thread for GNSS
'''
def uart_rx_gnss( threadName, ser):
  global event_flag
  global rx_buffer

  while(1):
    line = ser.readline()
    logger.debug(" GNSS >> " + str(line))

    with t_lock:
      rx_buffer = line
      event_flag = EVENT_GNSS
      t_event.set()      

'''
UART RX thread for cc1350
'''
def uart_rx_cc1350( threadName, ser, t_lock, t_event):
  global event_flag
  global rx_buffer

  while(1):
    cc1350_buffer = ser.readline()
    logger.debug(" CC1350 >> " + str(cc1350_buffer))

    with t_lock:
      rx_buffer = line
      event_flag = EVENT_CC1350
      t_event.set()


'''
  Periodically update if no uart
'''
def periodic_update( threadName, t_lock, t_event ):
  global event_flag

  while(1):
    time.sleep(3)
    with t_lock:
      event_flag = EVENT_TIMEOUT
      t_event.set()

'''
Main
'''
def main(verbosity="info", mode="normal"):
  # SIGING Handler 
  signal.signal(signal.SIGINT, signal_handler)

  ######### GLOBAL VARIABLES #########  
  global event_flag

  ser = ic.initialize_uart('/dev/ttymxc6', 9600)
  thread.start_new_thread( uart_rx_gnss, ("Thread-GNSS-RX", ser ) )

  ser = ic.initialize_uart('/dev/ttymxc4')
  thread.start_new_thread( uart_rx_cc1350, ("Thread-cc1350-RX", ser, lock, event ) )

  thread.start_new_thread( periodic_update, ("Updater", lock, event ) )

  # Main Loop
  while (running == True):
    event.wait()

    if (event_flag == EVENT_TIMEOUT):
      logger.info("EVENT: TIMEOUT")
      # UPDATE
    elif (event_flag == EVENT_GNSS):
      logger.info("EVENT: GNSS")
      # Parse rx_buffer
    elif (event_flag == EVENT_CC1350):
      logger.info("EVENT: CC1350") 
      # Parse rx_buffer
    else:
      logger.info("EVENT UNKNOWN")   

    event_flag = 0
    event.clear()
EN

回答 1

Stack Overflow用户

发布于 2017-08-31 02:47:47

这会爆炸的。

您所需要的只是两个关闭事件,并且您的全局evetn_flag将在竞争条件中被覆盖。

为此,您应该使用队列。

https://docs.python.org/3/library/queue.html

队列将保留顺序,并保证您的主线程将处理所有到达的事件。

你可以将一个任意的数据结构发布到队列中--所以,因为yu已经有了一个事件类型的“准枚举”,你可以发布一个元组,这个event_type作为第一个元素,任何你需要跨线程通信的数据都作为第二个元素。只需在生成线程之前创建一个queue.Queue对象,您甚至可以将其设置为全局变量,并使用队列的get方法代替event.wait()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45967701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档