class Link: def __init__(self, socket_obj, connection): self._connection = connection self._socket = socket_obj self._read_buffer = bytearray() self._write_queue = Queue() def read(self): result = bytearray('') while True: read_count = self._connection.recv_into(self._read_buffer, BUFFER_SIZE) if read_count > 0: result.extend(self._read_buffer[:read_count - 1]) else: break return bytearray def send(self, data): self._write_queue.put_nowait(data) self._socket.notify_send_data(self._connection.fileno()) def write(self): while self._write_queue.not_empty(): data = self._write_queue.get_nowait() self._connection.sendall(data) def close(self): self._connection.close()
def run_to_results_any(self, calls): res_queue = Queue() res_queue.not_empty = LooseCondition(res_queue.mutex) res_queue.not_full = LooseCondition(res_queue.mutex) def run(call): try: res = call() except Exception, e: res = ExecutionException(sys.exc_info()) res_queue.put(res) return res