14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Support for the API of the multiprocessing package using threads
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# multiprocessing/dummy/__init__.py
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Copyright (c) 2006-2008, R Oudkerk
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# All rights reserved.
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Redistribution and use in source and binary forms, with or without
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# modification, are permitted provided that the following conditions
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# are met:
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# 1. Redistributions of source code must retain the above copyright
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    notice, this list of conditions and the following disclaimer.
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# 2. Redistributions in binary form must reproduce the above copyright
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    notice, this list of conditions and the following disclaimer in the
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    documentation and/or other materials provided with the distribution.
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# 3. Neither the name of author nor the names of any contributors may be
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    used to endorse or promote products derived from this software
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    without specific prior written permission.
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# SUCH DAMAGE.
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__all__ = [
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'Process', 'current_process', 'active_children', 'freeze_support',
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Condition',
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'Event', 'Queue', 'Manager', 'Pipe', 'Pool', 'JoinableQueue'
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Imports
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport threading
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport sys
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport weakref
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport array
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport itertools
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom multiprocessing import TimeoutError, cpu_count
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom multiprocessing.dummy.connection import Pipe
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom threading import Lock, RLock, Semaphore, BoundedSemaphore
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom threading import Event
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom Queue import Queue
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass DummyProcess(threading.Thread):
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        threading.Thread.__init__(self, group, target, name, args, kwargs)
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._pid = None
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._children = weakref.WeakKeyDictionary()
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._start_called = False
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._parent = current_process()
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def start(self):
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        assert self._parent is current_process()
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._start_called = True
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if hasattr(self._parent, '_children'):
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._parent._children[self] = None
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        threading.Thread.start(self)
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def exitcode(self):
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._start_called and not self.is_alive():
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return 0
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return None
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass Condition(threading._Condition):
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    notify_all = threading._Condition.notify_all.im_func
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
954adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoProcess = DummyProcess
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocurrent_process = threading.current_thread
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocurrent_process()._children = weakref.WeakKeyDictionary()
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef active_children():
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    children = current_process()._children
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for p in list(children):
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not p.is_alive():
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            children.pop(p, None)
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return list(children)
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef freeze_support():
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass Namespace(object):
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, **kwds):
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.__dict__.update(kwds)
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __repr__(self):
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        items = self.__dict__.items()
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        temp = []
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for name, value in items:
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not name.startswith('_'):
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                temp.append('%s=%r' % (name, value))
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        temp.sort()
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return 'Namespace(%s)' % str.join(', ', temp)
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodict = dict
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaolist = list
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef Array(typecode, sequence, lock=True):
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return array.array(typecode, sequence)
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass Value(object):
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, typecode, value, lock=True):
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._typecode = typecode
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._value = value
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _get(self):
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._value
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _set(self, value):
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._value = value
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    value = property(_get, _set)
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __repr__(self):
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return '<%r(%r, %r)>'%(type(self).__name__,self._typecode,self._value)
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef Manager():
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return sys.modules[__name__]
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef shutdown():
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef Pool(processes=None, initializer=None, initargs=()):
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from multiprocessing.pool import ThreadPool
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return ThreadPool(processes, initializer, initargs)
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoJoinableQueue = Queue
154