def __init__(self, listen, handler, connect_addresses=set(), connect_interval=30): if isinstance(listen, int): listen = ("0.0.0.0", listen) self.uuid = uuid() self.handler = handler self.connections = dict() self.connect_interval = connect_interval self._connectAddresses = dict((addr, True) for addr in connect_addresses) self._sock = concurrent.listen(listen) self._server = concurrent.spawn(concurrent.serve, self._sock, self._connectionWrapper) self._connectThread = concurrent.spawn(self._connector) logging.getLogger("syncer").info("Listening on %s", listen)
def _connector(self): def _connect(addr): try: return addr, concurrent.connect(addr) except Exception: return addr, None connectPool = concurrent.Pool(20) while self._sock: addresses = [ addr for addr, uuid in self._connectAddresses.iteritems() if uuid and (uuid not in self.connections) ] for address, sock in connectPool.imap(_connect, addresses): if sock: self._connectAddresses[address] = False concurrent.spawn(self._connectionWrapper, sock, address, address) concurrent.sleep(self.connect_interval)
def socket_pair(): s = concurrent.socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("", 0)) try: s.listen(1) t = concurrent.spawn(s.accept) c1 = concurrent.connect(s.getsockname()) c2, _ = t.wait() return c1, c2 except: return None, None finally: s.close()
def test_upload(self): def server_side(): bind = self.s.next() assert_equals(bind.size, 130*1024) self.s.send(message.AssetStatus(status=message.SUCCESS)) uploaded = 0 for seg in self.s: if uploaded < 128*1024: assert_equals(len(seg.content), 64*1024) uploaded += len(seg.content) else: assert_equals(len(seg.content), 2*1024) self.s.send(message.AssetStatus(status=message.SUCCESS, ids=[ message.Identifier(type=message.TREE_TIGER, id='g"\xb6=\x1a8\x97i\xd9\xb3\xfd\xe0\xd0R"\xd8\xc9D\x0e\xc0"\xaeLQ') ])) break spawn(server_side) f = StringIO("A"*130*1024) ids = self.c.upload(f) assert_items_equal(ids, [ message.Identifier(type=message.TREE_TIGER, id='g"\xb6=\x1a8\x97i\xd9\xb3\xfd\xe0\xd0R"\xd8\xc9D\x0e\xc0"\xaeLQ') ])
def __init__(self, db, name, port, connect_addresses=set(), db_poll_interval=5, connect_interval=30): self._db = db self.name = name super(Syncer, self).__init__(port, self._spawn, connect_addresses, connect_interval) self.running = True self._pusher = concurrent.spawn(self._db_push, db_poll_interval)
def __init__(self, name="Server"): super(Server, self).__init__() self.s = listen(('', 0), backlog=1) self.name = "Server" self.res = spawn(self.run)
def run_parallel(*jobs): running = [concurrent.spawn(x) for x in jobs] return [x.wait() for x in running]
def __init__(self, interval, code): self.running = True self.running = concurrent.spawn(self._run, interval, code)
def connect(self, address=None): config = self.config if not address: address = config['address'] self._connection = Connection(address, config.get('myname', 'bhindex')) self._reader_greenlet = concurrent.spawn(self._reader)