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