code: def _time_threaded_normxcorr(templates, stream, *args, **kwargs):
      
      no_chans = np.zeros(len(templates))
      chans = [[] for _ in range(len(templates))]
      array_dict_tuple = _get_array_dicts(templates, stream)
      stream_dict, template_dict, pad_dict, seed_ids = array_dict_tuple
      cccsums = np.zeros([len(templates),
                          len(stream[0]) - len(templates[0][0]) + 1])
      for seed_id in seed_ids:
          tr_cc, tr_chans = time_multi_normxcorr(
              template_dict[seed_id], stream_dict[seed_id], pad_dict[seed_id],
              True)
          cccsums = np.sum([cccsums, tr_cc], axis=0)
          no_chans += tr_chans.astype(np.int)
          for chan, state in zip(chans, tr_chans):
              if state:
                  chan.append((seed_id.split('.')[1],
                               seed_id.split('.')[-1].split('_')[0]))
      return cccsums, no_chans, chans
docs: Use the threaded time-domain routine for concurrency
  
      :type templates: list
      :param templates:
          A list of templates, where each one should be an obspy.Stream object
          containing multiple traces of seismic data and the relevant header
          information.
      :type stream: obspy.core.stream.Stream
      :param stream:
          A single Stream object to be correlated with the templates.
  
      :returns:
          New list of :class:`numpy.ndarray` objects.  These will contain
          the correlation sums for each template for this day of data.
      :rtype: list
      :returns:
          list of ints as number of channels used for each cross-correlation.
      :rtype: list
      :returns:
          list of list of tuples of station, channel for all cross-correlations.
      :rtype: list