def worker(self, fifo):
logging.debug('<STR_LIT>', fifo)<EOL>self._fifo_conditions[fifo].acquire()<EOL>while True:<EOL><INDENT>try:<EOL><INDENT>data_tuple = self._fifo_data_deque[fifo].popleft()<EOL><DEDENT>except IndexError:<EOL><INDENT>self._fifo_conditions[fifo].wait(self.readout_interval)  <EOL><DEDENT>else:<EOL><INDENT>if data_tuple is None:  <EOL><INDENT>break<EOL><DEDENT>else:<EOL><INDENT>for index, (filter_func, converter_func, fifo_select) in enumerate(zip(self.filter_func, self.converter_func, self.fifo_select)):<EOL><INDENT>if fifo_select is None or fifo_select == fifo:<EOL><INDENT>converted_data_tuple = convert_data_iterable((data_tuple,), filter_func=filter_func, converter_func=converter_func)[<NUM_LIT:0>]<EOL>n_data_words = converted_data_tuple[<NUM_LIT:0>].shape[<NUM_LIT:0>]<EOL>with self.data_words_per_second_lock:<EOL><INDENT>self._words_per_read[index].append((n_data_words, converted_data_tuple[<NUM_LIT:1>], converted_data_tuple[<NUM_LIT:2>]))<EOL><DEDENT>self._data_deque[index].append(converted_data_tuple)<EOL>with self._data_conditions[index]:<EOL><INDENT>self._data_conditions[index].notify_all()<EOL><DEDENT><DEDENT><DEDENT><DEDENT><DEDENT><DEDENT>for index, fifo_select in enumerate(self.fifo_select):<EOL><INDENT>if fifo_select is None or fifo_select == fifo:<EOL><INDENT>self._data_deque[index].append(None)<EOL>with self._data_conditions[index]:<EOL><INDENT>self._data_conditions[index].notify_all()<EOL><DEDENT><DEDENT><DEDENT>self._fifo_conditions[fifo].release()<EOL>logging.debug('<STR_LIT>', fifo)<EOL>
Worker thread continuously filtering and converting data when data becomes available.