代码之家  ›  专栏  ›  技术社区  ›  Thomas Jacobs

如何在Python的运行线程中更改或调用方法?

  •  0
  • Thomas Jacobs  · 技术社区  · 7 年前

    我有一个生产者线程,它从串行连接生成数据,并将它们放入多个队列中,这些队列将由不同的消费者线程使用。然而,我希望能够在生产者线程已经开始运行之后,从主线程添加额外的队列(额外的使用者)。

    一、 e.在下面的代码中,我如何将队列添加到 在该线程运行时从主线程执行?我可以添加以下方法吗 addQueue(newQueue) 附加到该类的 ? 这似乎不太可能,因为线程将在run方法中。我可以创建一些类似于停止事件的事件吗?

    class ProducerThread(threading.Thread):
        def __init__(self, listOfQueues):
            super(ProducerThread, self).__init__()
            self.listOfQueues = listOfQueues
            self._stop_event = threading.Event() # Flag to be set when the thread should stop
    
        def run(self):
            ser = serial.Serial() # Some serial connection 
    
            while(not self.stopped()):
                try:
                    bytestring = ser.readline() # Serial connection or "producer" at some rate
                    for q in self.listOfQueues:
                        q.put(bytestring)
                except serial.SerialException:
                    continue
    
        def stop(self):
            '''
            Call this function to stop the thread. Must also use .join() in the main
            thread to fully ensure the thread has completed.
            :return: 
            '''
            self._stop_event.set()
    
        def stopped(self):
            '''
            Call this function to determine if the thread has stopped. 
            :return: boolean True or False
            '''
            return self._stop_event.is_set()
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   101    7 年前

    当然,您可以简单地拥有一个添加到列表中的append函数。例如。

    def append(self, element):
        self.listOfQueues.append(element)
    

    start() 方法已调用。

    对于非线程安全的过程,您可以使用锁,例如:

    def unsafe(self, element):
        with self.lock:
            # do stuff
    

    run 方法,例如:

    with lock:
        for q in self.listOfQueues:
            q.put(bytestring)
    

    任何获取锁的代码都将等待在其他地方释放锁。