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.")
Beispiel #2
0
    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