code: def run(self, *coros: CoroWrapper):
          
          if not self.running:
              raise RuntimeError("not running!")
  
          async def wrapper():
              results = []
              for coro in coros:
                  try:
                      if inspect.isawaitable(coro):
                          results.append(await coro)
                      elif inspect.isfunction(coro):
                          res = coro()
                          if inspect.isawaitable(res):
                              results.append(await res)
                          else:
                              results.append(res)
                      else:
                          raise RuntimeError(
                              "don't know how to run {}".format(coro))
                  except Exception as ex:
                      logger.error("Error while running coroutine {}: {}".format(coro.__name__, ex.__repr__()))
                      raise ex
              if len(results) == 1:
                  return results[0]
              return results
          if coros:
              what = wrapper()
          else:
              # if no coros supplied, then assume we run forever
              what = self.runFut
          return self.loop.run_until_complete(what)
docs: Runs an arbitrary list of coroutines in order and then quits the loop,
          if not running as a context manager.