|
|
#
|
|
|
# Module providing the `Process` class which emulates `threading.Thread`
|
|
|
#
|
|
|
# multiprocessing/process.py
|
|
|
#
|
|
|
# Copyright (c) 2006-2008, R Oudkerk
|
|
|
# Licensed to PSF under a Contributor Agreement.
|
|
|
#
|
|
|
|
|
|
__all__ = ['Process', 'current_process', 'active_children']
|
|
|
|
|
|
#
|
|
|
# Imports
|
|
|
#
|
|
|
|
|
|
import os
|
|
|
import sys
|
|
|
import signal
|
|
|
import itertools
|
|
|
from _weakrefset import WeakSet
|
|
|
|
|
|
#for brython
|
|
|
from _multiprocessing import Process
|
|
|
#
|
|
|
#
|
|
|
#
|
|
|
|
|
|
try:
|
|
|
ORIGINAL_DIR = os.path.abspath(os.getcwd())
|
|
|
except OSError:
|
|
|
ORIGINAL_DIR = None
|
|
|
|
|
|
#
|
|
|
# Public functions
|
|
|
#
|
|
|
|
|
|
def current_process():
|
|
|
'''
|
|
|
Return process object representing the current process
|
|
|
'''
|
|
|
return _current_process
|
|
|
|
|
|
def active_children():
|
|
|
'''
|
|
|
Return list of process objects corresponding to live child processes
|
|
|
'''
|
|
|
_cleanup()
|
|
|
return list(_current_process._children)
|
|
|
|
|
|
#
|
|
|
#
|
|
|
#
|
|
|
|
|
|
def _cleanup():
|
|
|
# check for processes which have finished
|
|
|
for p in list(_current_process._children):
|
|
|
if p._popen.poll() is not None:
|
|
|
_current_process._children.discard(p)
|
|
|
|
|
|
#
|
|
|
# The `Process` class
|
|
|
#
|
|
|
|
|
|
# brython note: class Process is defined in /usr/libs/_multiprocessing.js
|
|
|
|
|
|
|
|
|
#
|
|
|
# We subclass bytes to avoid accidental transmission of auth keys over network
|
|
|
#
|
|
|
|
|
|
class AuthenticationString(bytes):
|
|
|
def __reduce__(self):
|
|
|
from .forking import Popen
|
|
|
if not Popen.thread_is_spawning():
|
|
|
raise TypeError(
|
|
|
'Pickling an AuthenticationString object is '
|
|
|
'disallowed for security reasons'
|
|
|
)
|
|
|
return AuthenticationString, (bytes(self),)
|
|
|
|
|
|
#
|
|
|
# Create object representing the main process
|
|
|
#
|
|
|
|
|
|
class _MainProcess(Process):
|
|
|
|
|
|
def __init__(self):
|
|
|
self._identity = ()
|
|
|
self._daemonic = False
|
|
|
self._name = 'MainProcess'
|
|
|
self._parent_pid = None
|
|
|
self._popen = None
|
|
|
self._counter = itertools.count(1)
|
|
|
self._children = set()
|
|
|
self._authkey = AuthenticationString(os.urandom(32))
|
|
|
self._tempdir = None
|
|
|
|
|
|
_current_process = _MainProcess()
|
|
|
del _MainProcess
|
|
|
|
|
|
#
|
|
|
# Give names to some return codes
|
|
|
#
|
|
|
|
|
|
_exitcode_to_name = {}
|
|
|
|
|
|
for name, signum in list(signal.__dict__.items()):
|
|
|
if name[:3]=='SIG' and '_' not in name:
|
|
|
_exitcode_to_name[-signum] = name
|
|
|
|
|
|
# For debug and leak testing
|
|
|
_dangling = WeakSet()
|
|
|
|