14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Package analogous to 'threading.py' but using processes
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# multiprocessing/__init__.py
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# This package is intended to duplicate the functionality (and much of
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# the API) of threading.py but uses processes instead of threads.  A
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# subpackage 'multiprocessing.dummy' has the same API but is a simple
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# wrapper for 'threading'.
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Try calling `multiprocessing.doc.main()` to read the html
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# documentation in a webbrowser.
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Copyright (c) 2006-2008, R Oudkerk
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# All rights reserved.
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Redistribution and use in source and binary forms, with or without
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# modification, are permitted provided that the following conditions
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# are met:
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# 1. Redistributions of source code must retain the above copyright
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    notice, this list of conditions and the following disclaimer.
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# 2. Redistributions in binary form must reproduce the above copyright
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    notice, this list of conditions and the following disclaimer in the
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    documentation and/or other materials provided with the distribution.
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# 3. Neither the name of author nor the names of any contributors may be
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    used to endorse or promote products derived from this software
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    without specific prior written permission.
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# SUCH DAMAGE.
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__version__ = '0.70a1'
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__all__ = [
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'Process', 'current_process', 'active_children', 'freeze_support',
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'Manager', 'Pipe', 'cpu_count', 'log_to_stderr', 'get_logger',
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'allow_connection_pickling', 'BufferTooShort', 'TimeoutError',
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Condition',
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'Event', 'Queue', 'JoinableQueue', 'Pool', 'Value', 'Array',
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'RawValue', 'RawArray', 'SUBDEBUG', 'SUBWARNING',
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__author__ = 'R. Oudkerk (r.m.oudkerk@gmail.com)'
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Imports
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport sys
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom multiprocessing.process import Process, current_process, active_children
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom multiprocessing.util import SUBDEBUG, SUBWARNING
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Exceptions
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass ProcessError(Exception):
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BufferTooShort(ProcessError):
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TimeoutError(ProcessError):
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass AuthenticationError(ProcessError):
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# This is down here because _multiprocessing uses BufferTooShort
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport _multiprocessing
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Definitions not depending on native semaphores
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef Manager():
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns a manager associated with a running server process
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    The managers methods such as `Lock()`, `Condition()` and `Queue()`
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    can be used to create shared objects.
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.managers import SyncManager
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    m = SyncManager()
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    m.start()
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return m
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef Pipe(duplex=True):
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns two connection object connected by a pipe
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.connection import Pipe
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return Pipe(duplex)
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef cpu_count():
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns the number of CPUs in the system
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if sys.platform == 'win32':
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            num = int(os.environ['NUMBER_OF_PROCESSORS'])
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except (ValueError, KeyError):
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            num = 0
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    elif 'bsd' in sys.platform or sys.platform == 'darwin':
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        comm = '/sbin/sysctl -n hw.ncpu'
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if sys.platform == 'darwin':
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            comm = '/usr' + comm
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with os.popen(comm) as p:
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                num = int(p.read())
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ValueError:
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            num = 0
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            num = os.sysconf('SC_NPROCESSORS_ONLN')
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except (ValueError, OSError, AttributeError):
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            num = 0
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if num >= 1:
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return num
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise NotImplementedError('cannot determine number of cpus')
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef freeze_support():
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Check whether this is a fake forked process in a frozen executable.
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    If so then run code specified by commandline and exit.
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if sys.platform == 'win32' and getattr(sys, 'frozen', False):
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from multiprocessing.forking import freeze_support
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        freeze_support()
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef get_logger():
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Return package logger -- if it does not already exist then it is created
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.util import get_logger
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return get_logger()
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef log_to_stderr(level=None):
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Turn on logging and add a handler which prints to stderr
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.util import log_to_stderr
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return log_to_stderr(level)
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef allow_connection_pickling():
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Install support for sending connections and sockets between processes
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing import reduction
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Definitions depending on native semaphores
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef Lock():
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns a non-recursive lock object
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.synchronize import Lock
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return Lock()
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef RLock():
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns a recursive lock object
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.synchronize import RLock
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return RLock()
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef Condition(lock=None):
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns a condition object
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.synchronize import Condition
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return Condition(lock)
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef Semaphore(value=1):
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns a semaphore object
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.synchronize import Semaphore
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return Semaphore(value)
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef BoundedSemaphore(value=1):
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns a bounded semaphore object
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.synchronize import BoundedSemaphore
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return BoundedSemaphore(value)
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef Event():
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns an event object
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.synchronize import Event
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return Event()
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef Queue(maxsize=0):
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns a queue object
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.queues import Queue
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return Queue(maxsize)
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef JoinableQueue(maxsize=0):
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns a queue object
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.queues import JoinableQueue
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return JoinableQueue(maxsize)
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef Pool(processes=None, initializer=None, initargs=(), maxtasksperchild=None):
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns a process pool object
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.pool import Pool
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return Pool(processes, initializer, initargs, maxtasksperchild)
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef RawValue(typecode_or_type, *args):
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns a shared object
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.sharedctypes import RawValue
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return RawValue(typecode_or_type, *args)
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef RawArray(typecode_or_type, size_or_initializer):
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns a shared array
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.sharedctypes import RawArray
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return RawArray(typecode_or_type, size_or_initializer)
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef Value(typecode_or_type, *args, **kwds):
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns a synchronized shared object
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.sharedctypes import Value
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return Value(typecode_or_type, *args, **kwds)
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef Array(typecode_or_type, size_or_initializer, **kwds):
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns a synchronized shared array
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.sharedctypes import Array
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return Array(typecode_or_type, size_or_initializer, **kwds)
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif sys.platform == 'win32':
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def set_executable(executable):
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Sets the path to a python.exe or pythonw.exe binary used to run
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        child processes on Windows instead of sys.executable.
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Useful for people embedding Python.
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from multiprocessing.forking import set_executable
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        set_executable(executable)
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __all__ += ['set_executable']
278