def start_kernel(self, kernel_id=None, config=None, resource_limits=None): """Start a new kernel by forking. :arg str kernel_id: the id of the kernel to be started. If no id is passed, a uuid will be generated. :arg Ipython.config.loader config: kernel configuration. :arg dict resource_limits: a dict with keys resource.RLIMIT_* (see config_default documentation for explanation of valid options) and values of the limit for the given resource to be set in the kernel process :returns: kernel id and connection information which includes the kernel's ip, session key, and shell, heartbeat, stdin, and iopub port numbers :rtype: dict """ kernel_logger.debug("start_kernel with config %s", config) if kernel_id is None: kernel_id = str(uuid.uuid4()) if config is None: config = Config({"ip": self.ip}) if resource_limits is None: resource_limits = {} config.HistoryManager.enabled = False dir = os.path.join(self.dir, kernel_id) try: os.mkdir(dir) except OSError as exc: if exc.errno != errno.EEXIST: raise currdir = os.getcwd() os.chdir(dir) p, q = Pipe() proc = Process(target=self.fork_kernel, args=(config, q, resource_limits)) proc.start() os.chdir(currdir) # TODO: yield back to the message processing while we wait for i in range(10): if p.poll(1): connection = p.recv() p.close() self.kernels[kernel_id] = (proc, connection) return {"kernel_id": kernel_id, "connection": connection} else: kernel_logger.info( "Kernel %s did not start after %d seconds." % (kernel_id[:4], i)) p.close() self._kill_process(proc) raise KernelError("Kernel start timeout.")
def start_kernel(self, kernel_id=None, config=None, resource_limits=None): """ A function for starting new kernels by forking. :arg str kernel_id: the id of the kernel to be started. If no id is passed, a uuid will be generated. :arg Ipython.config.loader config: kernel configuration. :arg dict resource_limits: a dict with keys resource.RLIMIT_* (see config_default documentation for explanation of valid options) and values of the limit for the given resource to be set in the kernel process :returns: kernel id and connection information which includes the kernel's ip, session key, and shell, heartbeat, stdin, and iopub port numbers :rtype: dict """ kernel_logger.debug("start_kernel with config %s", config) if kernel_id is None: kernel_id = str(uuid.uuid4()) if config is None: config = Config({"ip": self.ip}) if resource_limits is None: resource_limits = {} config.HistoryManager.enabled = False dir = os.path.join(self.dir, kernel_id) try: os.mkdir(dir) except OSError: # TODO: take care of race conditions and other problems with us # using an 'unclean' directory pass currdir = os.getcwd() os.chdir(dir) p, q = Pipe() proc = Process(target=self.fork_kernel, args=(config, q, resource_limits)) proc.start() os.chdir(currdir) # todo: yield back to the message processing while we wait for i in range(5): if p.poll(1): connection = p.recv() p.close() self.kernels[kernel_id] = (proc, connection) return {"kernel_id": kernel_id, "connection": connection} else: kernel_logger.info("Kernel %s did not start after %d seconds." % (kernel_id[:4], i)) p.close() self.kill_process(proc) raise KernelError("Kernel start timeout.")
def start_kernel(self, resource_limits=None): retry=3 while retry: try: x = self.fkm.start_kernel(resource_limits=resource_limits) break except KernelError as e: retry -=1 kernel_logger.debug("kernel error--trying again %s"%retry) if not retry: kernel_logger.debug("kernel error--giving up %s"%retry) kernel_logger.exception(e) raise self._kernels.add(x["kernel_id"]) return x
def start_kernel(self, resource_limits=None): retry = 3 while retry: try: x = self.fkm.start_kernel(resource_limits=resource_limits) break except KernelError as e: retry -= 1 kernel_logger.debug("kernel error--trying again %s" % retry) if not retry: kernel_logger.debug("kernel error--giving up %s" % retry) kernel_logger.exception(e) raise self._kernels.add(x["kernel_id"]) return x