1*cda5da8dSAndroid Build Coastguard Worker# 2*cda5da8dSAndroid Build Coastguard Worker# Analogue of `multiprocessing.connection` which uses queues instead of sockets 3*cda5da8dSAndroid Build Coastguard Worker# 4*cda5da8dSAndroid Build Coastguard Worker# multiprocessing/dummy/connection.py 5*cda5da8dSAndroid Build Coastguard Worker# 6*cda5da8dSAndroid Build Coastguard Worker# Copyright (c) 2006-2008, R Oudkerk 7*cda5da8dSAndroid Build Coastguard Worker# Licensed to PSF under a Contributor Agreement. 8*cda5da8dSAndroid Build Coastguard Worker# 9*cda5da8dSAndroid Build Coastguard Worker 10*cda5da8dSAndroid Build Coastguard Worker__all__ = [ 'Client', 'Listener', 'Pipe' ] 11*cda5da8dSAndroid Build Coastguard Worker 12*cda5da8dSAndroid Build Coastguard Workerfrom queue import Queue 13*cda5da8dSAndroid Build Coastguard Worker 14*cda5da8dSAndroid Build Coastguard Worker 15*cda5da8dSAndroid Build Coastguard Workerfamilies = [None] 16*cda5da8dSAndroid Build Coastguard Worker 17*cda5da8dSAndroid Build Coastguard Worker 18*cda5da8dSAndroid Build Coastguard Workerclass Listener(object): 19*cda5da8dSAndroid Build Coastguard Worker 20*cda5da8dSAndroid Build Coastguard Worker def __init__(self, address=None, family=None, backlog=1): 21*cda5da8dSAndroid Build Coastguard Worker self._backlog_queue = Queue(backlog) 22*cda5da8dSAndroid Build Coastguard Worker 23*cda5da8dSAndroid Build Coastguard Worker def accept(self): 24*cda5da8dSAndroid Build Coastguard Worker return Connection(*self._backlog_queue.get()) 25*cda5da8dSAndroid Build Coastguard Worker 26*cda5da8dSAndroid Build Coastguard Worker def close(self): 27*cda5da8dSAndroid Build Coastguard Worker self._backlog_queue = None 28*cda5da8dSAndroid Build Coastguard Worker 29*cda5da8dSAndroid Build Coastguard Worker @property 30*cda5da8dSAndroid Build Coastguard Worker def address(self): 31*cda5da8dSAndroid Build Coastguard Worker return self._backlog_queue 32*cda5da8dSAndroid Build Coastguard Worker 33*cda5da8dSAndroid Build Coastguard Worker def __enter__(self): 34*cda5da8dSAndroid Build Coastguard Worker return self 35*cda5da8dSAndroid Build Coastguard Worker 36*cda5da8dSAndroid Build Coastguard Worker def __exit__(self, exc_type, exc_value, exc_tb): 37*cda5da8dSAndroid Build Coastguard Worker self.close() 38*cda5da8dSAndroid Build Coastguard Worker 39*cda5da8dSAndroid Build Coastguard Worker 40*cda5da8dSAndroid Build Coastguard Workerdef Client(address): 41*cda5da8dSAndroid Build Coastguard Worker _in, _out = Queue(), Queue() 42*cda5da8dSAndroid Build Coastguard Worker address.put((_out, _in)) 43*cda5da8dSAndroid Build Coastguard Worker return Connection(_in, _out) 44*cda5da8dSAndroid Build Coastguard Worker 45*cda5da8dSAndroid Build Coastguard Worker 46*cda5da8dSAndroid Build Coastguard Workerdef Pipe(duplex=True): 47*cda5da8dSAndroid Build Coastguard Worker a, b = Queue(), Queue() 48*cda5da8dSAndroid Build Coastguard Worker return Connection(a, b), Connection(b, a) 49*cda5da8dSAndroid Build Coastguard Worker 50*cda5da8dSAndroid Build Coastguard Worker 51*cda5da8dSAndroid Build Coastguard Workerclass Connection(object): 52*cda5da8dSAndroid Build Coastguard Worker 53*cda5da8dSAndroid Build Coastguard Worker def __init__(self, _in, _out): 54*cda5da8dSAndroid Build Coastguard Worker self._out = _out 55*cda5da8dSAndroid Build Coastguard Worker self._in = _in 56*cda5da8dSAndroid Build Coastguard Worker self.send = self.send_bytes = _out.put 57*cda5da8dSAndroid Build Coastguard Worker self.recv = self.recv_bytes = _in.get 58*cda5da8dSAndroid Build Coastguard Worker 59*cda5da8dSAndroid Build Coastguard Worker def poll(self, timeout=0.0): 60*cda5da8dSAndroid Build Coastguard Worker if self._in.qsize() > 0: 61*cda5da8dSAndroid Build Coastguard Worker return True 62*cda5da8dSAndroid Build Coastguard Worker if timeout <= 0.0: 63*cda5da8dSAndroid Build Coastguard Worker return False 64*cda5da8dSAndroid Build Coastguard Worker with self._in.not_empty: 65*cda5da8dSAndroid Build Coastguard Worker self._in.not_empty.wait(timeout) 66*cda5da8dSAndroid Build Coastguard Worker return self._in.qsize() > 0 67*cda5da8dSAndroid Build Coastguard Worker 68*cda5da8dSAndroid Build Coastguard Worker def close(self): 69*cda5da8dSAndroid Build Coastguard Worker pass 70*cda5da8dSAndroid Build Coastguard Worker 71*cda5da8dSAndroid Build Coastguard Worker def __enter__(self): 72*cda5da8dSAndroid Build Coastguard Worker return self 73*cda5da8dSAndroid Build Coastguard Worker 74*cda5da8dSAndroid Build Coastguard Worker def __exit__(self, exc_type, exc_value, exc_tb): 75*cda5da8dSAndroid Build Coastguard Worker self.close() 76