| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- ###############################################################################
- # LokyProcess implementation
- #
- # authors: Thomas Moreau and Olivier Grisel
- #
- # based on multiprocessing/process.py (17/02/2017)
- # * Add some compatibility function for python2.7 and 3.3
- #
- import os
- import sys
- from .compat import BaseProcess
- class LokyProcess(BaseProcess):
- _start_method = 'loky'
- def __init__(self, group=None, target=None, name=None, args=(),
- kwargs={}, daemon=None, init_main_module=False,
- env=None):
- if sys.version_info < (3, 3):
- super(LokyProcess, self).__init__(
- group=group, target=target, name=name, args=args,
- kwargs=kwargs)
- self.daemon = daemon
- else:
- super(LokyProcess, self).__init__(
- group=group, target=target, name=name, args=args,
- kwargs=kwargs, daemon=daemon)
- self.env = {} if env is None else env
- self.authkey = self.authkey
- self.init_main_module = init_main_module
- @staticmethod
- def _Popen(process_obj):
- if sys.platform == "win32":
- from .popen_loky_win32 import Popen
- else:
- from .popen_loky_posix import Popen
- return Popen(process_obj)
- if sys.version_info < (3, 3):
- def start(self):
- '''
- Start child process
- '''
- from multiprocessing.process import _current_process, _cleanup
- assert self._popen is None, 'cannot start a process twice'
- assert self._parent_pid == os.getpid(), \
- 'can only start a process object created by current process'
- _cleanup()
- self._popen = self._Popen(self)
- self._sentinel = self._popen.sentinel
- _current_process._children.add(self)
- @property
- def sentinel(self):
- '''
- Return a file descriptor (Unix) or handle (Windows) suitable for
- waiting for process termination.
- '''
- try:
- return self._sentinel
- except AttributeError:
- raise ValueError("process not started")
- if sys.version_info < (3, 4):
- @property
- def authkey(self):
- return self._authkey
- @authkey.setter
- def authkey(self, authkey):
- '''
- Set authorization key of process
- '''
- self._authkey = AuthenticationKey(authkey)
- def _bootstrap(self):
- from .context import set_start_method
- set_start_method(self._start_method)
- super(LokyProcess, self)._bootstrap()
- class LokyInitMainProcess(LokyProcess):
- _start_method = 'loky_init_main'
- def __init__(self, group=None, target=None, name=None, args=(),
- kwargs={}, daemon=None):
- super(LokyInitMainProcess, self).__init__(
- group=group, target=target, name=name, args=args, kwargs=kwargs,
- daemon=daemon, init_main_module=True)
- #
- # We subclass bytes to avoid accidental transmission of auth keys over network
- #
- class AuthenticationKey(bytes):
- def __reduce__(self):
- from .context import assert_spawning
- try:
- assert_spawning(self)
- except RuntimeError:
- raise TypeError(
- 'Pickling an AuthenticationKey object is '
- 'disallowed for security reasons'
- )
- return AuthenticationKey, (bytes(self),)
|