Spawn a server process for this manager object
(self, initializer=None, initargs=())
| 537 | self._state.value = State.STARTED |
| 538 | |
| 539 | def start(self, initializer=None, initargs=()): |
| 540 | ''' |
| 541 | Spawn a server process for this manager object |
| 542 | ''' |
| 543 | if self._state.value != State.INITIAL: |
| 544 | if self._state.value == State.STARTED: |
| 545 | raise ProcessError("Already started server") |
| 546 | elif self._state.value == State.SHUTDOWN: |
| 547 | raise ProcessError("Manager has shut down") |
| 548 | else: |
| 549 | raise ProcessError( |
| 550 | "Unknown state {!r}".format(self._state.value)) |
| 551 | |
| 552 | if initializer is not None and not callable(initializer): |
| 553 | raise TypeError('initializer must be a callable') |
| 554 | |
| 555 | # pipe over which we will retrieve address of server |
| 556 | reader, writer = connection.Pipe(duplex=False) |
| 557 | |
| 558 | # spawn process which runs a server |
| 559 | self._process = self._ctx.Process( |
| 560 | target=type(self)._run_server, |
| 561 | args=(self._registry, self._address, self._authkey, |
| 562 | self._serializer, writer, initializer, initargs), |
| 563 | ) |
| 564 | ident = ':'.join(str(i) for i in self._process._identity) |
| 565 | self._process.name = type(self).__name__ + '-' + ident |
| 566 | self._process.start() |
| 567 | |
| 568 | # get address of server |
| 569 | writer.close() |
| 570 | self._address = reader.recv() |
| 571 | reader.close() |
| 572 | |
| 573 | # register a finalizer |
| 574 | self._state.value = State.STARTED |
| 575 | self.shutdown = util.Finalize( |
| 576 | self, type(self)._finalize_manager, |
| 577 | args=(self._process, self._address, self._authkey, self._state, |
| 578 | self._Client, self._shutdown_timeout), |
| 579 | exitpriority=0 |
| 580 | ) |
| 581 | |
| 582 | @classmethod |
| 583 | def _run_server(cls, registry, address, authkey, serializer, writer, |