17db96d56Sopenharmony_ci# 27db96d56Sopenharmony_ci# Analogue of `multiprocessing.connection` which uses queues instead of sockets 37db96d56Sopenharmony_ci# 47db96d56Sopenharmony_ci# multiprocessing/dummy/connection.py 57db96d56Sopenharmony_ci# 67db96d56Sopenharmony_ci# Copyright (c) 2006-2008, R Oudkerk 77db96d56Sopenharmony_ci# Licensed to PSF under a Contributor Agreement. 87db96d56Sopenharmony_ci# 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ci__all__ = [ 'Client', 'Listener', 'Pipe' ] 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_cifrom queue import Queue 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_cifamilies = [None] 167db96d56Sopenharmony_ci 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_ciclass Listener(object): 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ci def __init__(self, address=None, family=None, backlog=1): 217db96d56Sopenharmony_ci self._backlog_queue = Queue(backlog) 227db96d56Sopenharmony_ci 237db96d56Sopenharmony_ci def accept(self): 247db96d56Sopenharmony_ci return Connection(*self._backlog_queue.get()) 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_ci def close(self): 277db96d56Sopenharmony_ci self._backlog_queue = None 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_ci @property 307db96d56Sopenharmony_ci def address(self): 317db96d56Sopenharmony_ci return self._backlog_queue 327db96d56Sopenharmony_ci 337db96d56Sopenharmony_ci def __enter__(self): 347db96d56Sopenharmony_ci return self 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ci def __exit__(self, exc_type, exc_value, exc_tb): 377db96d56Sopenharmony_ci self.close() 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_cidef Client(address): 417db96d56Sopenharmony_ci _in, _out = Queue(), Queue() 427db96d56Sopenharmony_ci address.put((_out, _in)) 437db96d56Sopenharmony_ci return Connection(_in, _out) 447db96d56Sopenharmony_ci 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_cidef Pipe(duplex=True): 477db96d56Sopenharmony_ci a, b = Queue(), Queue() 487db96d56Sopenharmony_ci return Connection(a, b), Connection(b, a) 497db96d56Sopenharmony_ci 507db96d56Sopenharmony_ci 517db96d56Sopenharmony_ciclass Connection(object): 527db96d56Sopenharmony_ci 537db96d56Sopenharmony_ci def __init__(self, _in, _out): 547db96d56Sopenharmony_ci self._out = _out 557db96d56Sopenharmony_ci self._in = _in 567db96d56Sopenharmony_ci self.send = self.send_bytes = _out.put 577db96d56Sopenharmony_ci self.recv = self.recv_bytes = _in.get 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ci def poll(self, timeout=0.0): 607db96d56Sopenharmony_ci if self._in.qsize() > 0: 617db96d56Sopenharmony_ci return True 627db96d56Sopenharmony_ci if timeout <= 0.0: 637db96d56Sopenharmony_ci return False 647db96d56Sopenharmony_ci with self._in.not_empty: 657db96d56Sopenharmony_ci self._in.not_empty.wait(timeout) 667db96d56Sopenharmony_ci return self._in.qsize() > 0 677db96d56Sopenharmony_ci 687db96d56Sopenharmony_ci def close(self): 697db96d56Sopenharmony_ci pass 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_ci def __enter__(self): 727db96d56Sopenharmony_ci return self 737db96d56Sopenharmony_ci 747db96d56Sopenharmony_ci def __exit__(self, exc_type, exc_value, exc_tb): 757db96d56Sopenharmony_ci self.close() 76