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