code: def run_multicore(fn, items, config, parallel=None):
      
      if len(items) == 0:
          return []
      if parallel is None or "num_jobs" not in parallel:
          if parallel is None:
              parallel = {"type": "local", "cores": config["algorithm"].get("num_cores", 1)}
          sysinfo = system.get_info({}, parallel)
          parallel = resources.calculate(parallel, items, sysinfo, config,
                                         parallel.get("multiplier", 1),
                                         max_multicore=int(parallel.get("max_multicore", sysinfo["cores"])))
      items = [config_utils.add_cores_to_config(x, parallel["cores_per_job"]) for x in items]
      if joblib is None:
          raise ImportError("Need joblib for multiprocessing parallelization")
      out = []
      for data in joblib.Parallel(parallel["num_jobs"], batch_size=1, backend="multiprocessing")(joblib.delayed(fn)(*x) for x in items):
          if data:
              out.extend(data)
      return out
docs: Run the function using multiple cores on the given items to process.