class_docstr: A ParallelBackend which will use a thread pool to execute batches in.
  
  This is a low-overhead backend but it suffers from the Python Global
  Interpreter Lock if the called function relies a lot on Python objects.
  Mostly useful when the execution bottleneck is a compiled extension that
  explicitly releases the GIL (for instance a Cython loop wrapped in a
  "with nogil" block or an expensive call to a library such as NumPy).
class_docstr_tok: ["A","ParallelBackend","which","will","use","a","thread","pool","to","execute","batches","in",".","This","is","a","low-overhead","backend","but","it","suffers","from","the","Python","Global","Interpreter","Lock","if","the","called","function","relies","a","lot","on","Python","objects",".","Mostly","useful","when","the","execution","bottleneck","is","a","compiled","extension","that","explicitly","releases","the","GIL","(","for","instance","a","Cython","loop","wrapped","in","a","''","with","nogil","''","block","or","an","expensive","call","to","a","library","such","as","NumPy",")","."]
docstr: Build a process or thread pool and return the number of workers
code: def configure(self, n_jobs=1, parallel=None, **backend_args):
      """Build a process or thread pool and return the number of workers"""
      n_jobs = self.effective_n_jobs(n_jobs)
      if n_jobs == 1:
          # Avoid unnecessary overhead and use sequential backend instead.
          raise FallbackToBackend(SequentialBackend())
      self.parallel = parallel
      self._pool = ThreadPool(n_jobs)
      return n_jobs
  
imports: import gc
  import os
  import sys
  import warnings
  import threading
  from abc import ABCMeta, abstractmethod
  from .format_stack import format_exc
  from .my_exceptions import WorkerInterrupt, TransportableException
  from ._multiprocessing_helpers import mp
  from ._compat import with_metaclass
label_desc: Use image node_id 1 for calling the ThreadingBackend obj's underlying member method code with example usage: obj.configure(n_jobs, parallel) and returns: n_jobs