| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # Support for the API of the multiprocessing package using threads | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # multiprocessing/dummy/__init__.py | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2010-12-14 01:38:16 +00:00
										 |  |  | # Copyright (c) 2006-2008, R Oudkerk | 
					
						
							| 
									
										
										
										
											2013-01-01 14:25:59 +00:00
										 |  |  | # Licensed to PSF under a Contributor Agreement. | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __all__ = [ | 
					
						
							|  |  |  |     'Process', 'current_process', 'active_children', 'freeze_support', | 
					
						
							|  |  |  |     'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Condition', | 
					
						
							| 
									
										
										
										
											2012-06-15 18:26:07 +01:00
										 |  |  |     'Event', 'Barrier', 'Queue', 'Manager', 'Pipe', 'Pool', 'JoinableQueue' | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Imports | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import threading | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import weakref | 
					
						
							|  |  |  | import array | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-14 15:35:41 +01:00
										 |  |  | from .connection import Pipe | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | from threading import Lock, RLock, Semaphore, BoundedSemaphore | 
					
						
							| 
									
										
										
										
											2012-06-15 18:26:07 +01:00
										 |  |  | from threading import Event, Condition, Barrier | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | from queue import Queue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class DummyProcess(threading.Thread): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, group=None, target=None, name=None, args=(), kwargs={}): | 
					
						
							|  |  |  |         threading.Thread.__init__(self, group, target, name, args, kwargs) | 
					
						
							|  |  |  |         self._pid = None | 
					
						
							|  |  |  |         self._children = weakref.WeakKeyDictionary() | 
					
						
							|  |  |  |         self._start_called = False | 
					
						
							|  |  |  |         self._parent = current_process() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def start(self): | 
					
						
							|  |  |  |         assert self._parent is current_process() | 
					
						
							|  |  |  |         self._start_called = True | 
					
						
							| 
									
										
										
										
											2012-05-25 12:57:58 +01:00
										 |  |  |         if hasattr(self._parent, '_children'): | 
					
						
							|  |  |  |             self._parent._children[self] = None | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |         threading.Thread.start(self) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-19 19:17:39 +00:00
										 |  |  |     @property | 
					
						
							|  |  |  |     def exitcode(self): | 
					
						
							| 
									
										
										
										
											2008-06-11 19:14:14 +00:00
										 |  |  |         if self._start_called and not self.is_alive(): | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |             return 0 | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Process = DummyProcess | 
					
						
							| 
									
										
										
										
											2008-06-11 19:14:14 +00:00
										 |  |  | current_process = threading.current_thread | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | current_process()._children = weakref.WeakKeyDictionary() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def active_children(): | 
					
						
							|  |  |  |     children = current_process()._children | 
					
						
							|  |  |  |     for p in list(children): | 
					
						
							| 
									
										
										
										
											2008-06-11 19:14:14 +00:00
										 |  |  |         if not p.is_alive(): | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |             children.pop(p, None) | 
					
						
							|  |  |  |     return list(children) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def freeze_support(): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Namespace(object): | 
					
						
							|  |  |  |     def __init__(self, **kwds): | 
					
						
							|  |  |  |         self.__dict__.update(kwds) | 
					
						
							|  |  |  |     def __repr__(self): | 
					
						
							|  |  |  |         items = list(self.__dict__.items()) | 
					
						
							|  |  |  |         temp = [] | 
					
						
							|  |  |  |         for name, value in items: | 
					
						
							|  |  |  |             if not name.startswith('_'): | 
					
						
							|  |  |  |                 temp.append('%s=%r' % (name, value)) | 
					
						
							|  |  |  |         temp.sort() | 
					
						
							|  |  |  |         return 'Namespace(%s)' % str.join(', ', temp) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | dict = dict | 
					
						
							|  |  |  | list = list | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def Array(typecode, sequence, lock=True): | 
					
						
							|  |  |  |     return array.array(typecode, sequence) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Value(object): | 
					
						
							|  |  |  |     def __init__(self, typecode, value, lock=True): | 
					
						
							|  |  |  |         self._typecode = typecode | 
					
						
							|  |  |  |         self._value = value | 
					
						
							|  |  |  |     def _get(self): | 
					
						
							|  |  |  |         return self._value | 
					
						
							|  |  |  |     def _set(self, value): | 
					
						
							|  |  |  |         self._value = value | 
					
						
							|  |  |  |     value = property(_get, _set) | 
					
						
							|  |  |  |     def __repr__(self): | 
					
						
							|  |  |  |         return '<%r(%r, %r)>'%(type(self).__name__,self._typecode,self._value) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def Manager(): | 
					
						
							|  |  |  |     return sys.modules[__name__] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def shutdown(): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def Pool(processes=None, initializer=None, initargs=()): | 
					
						
							| 
									
										
										
										
											2013-08-14 15:35:41 +01:00
										 |  |  |     from ..pool import ThreadPool | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |     return ThreadPool(processes, initializer, initargs) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | JoinableQueue = Queue |