| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # Analogue of `multiprocessing.connection` which uses queues instead of sockets | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # multiprocessing/dummy/connection.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__ = [ 'Client', 'Listener', 'Pipe' ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from queue import Queue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | families = [None] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Listener(object): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, address=None, family=None, backlog=1): | 
					
						
							|  |  |  |         self._backlog_queue = Queue(backlog) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def accept(self): | 
					
						
							|  |  |  |         return Connection(*self._backlog_queue.get()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def close(self): | 
					
						
							|  |  |  |         self._backlog_queue = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-19 08:40:32 +02:00
										 |  |  |     @property | 
					
						
							|  |  |  |     def address(self): | 
					
						
							|  |  |  |         return self._backlog_queue | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 17:47:52 +01:00
										 |  |  |     def __enter__(self): | 
					
						
							|  |  |  |         return self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __exit__(self, exc_type, exc_value, exc_tb): | 
					
						
							|  |  |  |         self.close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def Client(address): | 
					
						
							|  |  |  |     _in, _out = Queue(), Queue() | 
					
						
							|  |  |  |     address.put((_out, _in)) | 
					
						
							|  |  |  |     return Connection(_in, _out) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def Pipe(duplex=True): | 
					
						
							|  |  |  |     a, b = Queue(), Queue() | 
					
						
							|  |  |  |     return Connection(a, b), Connection(b, a) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Connection(object): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, _in, _out): | 
					
						
							|  |  |  |         self._out = _out | 
					
						
							|  |  |  |         self._in = _in | 
					
						
							|  |  |  |         self.send = self.send_bytes = _out.put | 
					
						
							|  |  |  |         self.recv = self.recv_bytes = _in.get | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def poll(self, timeout=0.0): | 
					
						
							|  |  |  |         if self._in.qsize() > 0: | 
					
						
							|  |  |  |             return True | 
					
						
							|  |  |  |         if timeout <= 0.0: | 
					
						
							|  |  |  |             return False | 
					
						
							| 
									
										
										
										
											2014-05-25 14:12:12 +01:00
										 |  |  |         with self._in.not_empty: | 
					
						
							|  |  |  |             self._in.not_empty.wait(timeout) | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |         return self._in.qsize() > 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def close(self): | 
					
						
							|  |  |  |         pass | 
					
						
							| 
									
										
										
										
											2012-06-18 17:47:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def __enter__(self): | 
					
						
							|  |  |  |         return self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __exit__(self, exc_type, exc_value, exc_tb): | 
					
						
							|  |  |  |         self.close() |