async def main(): with pynng.Rep0() as rep: n0 = await node0(rep) await curio.sleep(1) await node1() await n0.cancel()
def test_synchronous_recv_context(): with pynng.Rep0(listen=addr, recv_timeout=500) as rep, \ pynng.Req0(dial=addr, recv_timeout=500) as req: req.send(b'oh hello there old pal') assert rep.recv() == b'oh hello there old pal' rep.send(b'it is so good to hear from you') assert req.recv() == b'it is so good to hear from you'
def _connect(self): self._buff = Queue() self._rep = pynng.Rep0() bind = False while not bind: try: addr = 'tcp://' + get_network_ip() + ':' + str( random.randrange(MIN_PORT, MAX_PORT)) self._rep.listen(addr) logger.debug('Assigned server address is %s', addr) bind = True except pynng.exceptions.AddressInUse: pass self._listener = threading.Thread(target=self._listen) self._listener.daemon = True self._listener.start() self._req = None logger.debug('Set server address %s as handle %s', addr, self._handle) self._client.set(self._handle, bytes(addr, 'utf-8'), ex=mp_config.get_parameter( mp_config.REDIS_EXPIRY_TIME))
def main(): for N in [100, 3 * 1024 * 1024, 1920 * 1080 * 3]: ba = (random.getrandbits(8 * N)).to_bytes(N, sys.byteorder) with pynng.Rep0(listen=ipc_address) as rep, pynng.Req0(dial=ipc_address) as req: t0 = time.time_ns() req.send(ba) rep.send(rep.recv()) print((time.time_ns() - t0) / 10 ** 6, "ms")
async def receive_loop(self): with pynng.Rep0(listen=self.address) as sock: self.rep_sock = sock while True: msg = await self.rep_sock.arecv_msg() msg_bytes = msg.bytes if msg_bytes == b'exit': await self.rep_sock.asend(b'ACK') print('exiting') break await self._handle_bytes_received(msg_bytes)
def server(addr, n, dm, rm): with pynng.Rep0(listen=addr) as rep: ba = (random.getrandbits(8 * n)).to_bytes(n, sys.byteorder) while True: if rep.recv() == b"connect": rep.send(b"data") if rep.recv() == b"ready": print(len(dm)) t0 = time.time_ns() rm.write(ba) print("write result to mmap: ", (time.time_ns() - t0) / 10 ** 6, "ms") rep.send(b"result") if rep.recv() == b"get": rep.send(b"data")
async def server_loop(nursery, worker_name, address): async def handle_req(sock, bytes): await trio.sleep(random.randint(1, 60)/10) print(f" {worker_name} received: {bytes}") await sock.asend(b'ack:' + bytes) with pynng.Rep0(listen=address) as rep_sock: while True: msg = await rep_sock.arecv_msg() msg_bytes = msg.bytes nursery.start_soon( handle_req, rep_sock, msg_bytes )
def test_context_recv_send_msg(): with pynng.Req0(listen=addr, recv_timeout=to) as s1, \ pynng.Rep0(dial=addr, recv_timeout=to) as s2: with s1.new_context() as ctx1, s2.new_context() as ctx2: wait_pipe_len(s1, 1) msg = pynng.Message(b'do i even know you') ctx1.send_msg(msg) msg2 = ctx2.recv_msg() assert msg2.pipe is s2.pipes[0] assert msg2.bytes == b'do i even know you' msg3 = pynng.Message(b'yes of course i am your favorite platypus') ctx2.send_msg(msg3) msg4 = ctx1.recv_msg() assert msg4.pipe is s1.pipes[0] assert msg4.bytes == b'yes of course i am your favorite platypus'
def test_cannot_double_send(): # double send would cause a SEGFAULT!!! That's no good with pynng.Req0(listen=addr, recv_timeout=to) as s1, \ pynng.Rep0(dial=addr, recv_timeout=to) as s2: msg = pynng.Message(b'this is great') s1.send_msg(msg) with pytest.raises(pynng.MessageStateError): s1.send_msg(msg) with s1.new_context() as ctx: msg = pynng.Message(b'this also is great') ctx.send_msg(msg) with pytest.raises(pynng.MessageStateError): ctx.send_msg(msg) # don't really need to receive, but linters hate not using s2 s2.recv_msg()
def test_reqrep0(): with pynng.Req0(listen=addr, recv_timeout=100) as req, \ pynng.Rep0(dial=addr, recv_timeout=100) as rep: request = b'i am requesting' req.send(request) assert rep.recv() == request response = b'i am responding' rep.send(response) assert req.recv() == response with pytest.raises(pynng.BadState): req.recv() # responders can't send before receiving with pytest.raises(pynng.BadState): rep.send(b'I cannot do this why am I trying')
async def test_multiple_contexts(): async def recv_and_send(ctx): data = await ctx.arecv() await trio.sleep(0.05) await ctx.asend(data) with pynng.Rep0(listen=addr, recv_timeout=500) as rep, \ pynng.Req0(dial=addr, recv_timeout=500) as req1, \ pynng.Req0(dial=addr, recv_timeout=500) as req2: async with trio.open_nursery() as n: ctx1, ctx2 = [rep.new_context() for _ in range(2)] with ctx1, ctx2: n.start_soon(recv_and_send, ctx1) n.start_soon(recv_and_send, ctx2) await req1.asend(b'oh hi') await req2.asend(b'me toooo') assert (await req1.arecv() == b'oh hi') assert (await req2.arecv() == b'me toooo')
async def test_context(): with pynng.Req0(listen=addr, recv_timeout=1000) as req_sock, \ pynng.Rep0(dial=addr, recv_timeout=1000) as rep_sock: with req_sock.new_context() as req, rep_sock.new_context() as rep: assert isinstance(req, pynng.Context) assert isinstance(rep, pynng.Context) request = b'i am requesting' await req.asend(request) assert await rep.arecv() == request response = b'i am responding' await rep.asend(response) assert await req.arecv() == response with pytest.raises(pynng.BadState): await req.arecv() # responders can't send before receiving with pytest.raises(pynng.BadState): await rep.asend(b'I cannot do this why am I trying')
def test_multiple_contexts(): async def recv_and_send(ctx): data = await ctx.arecv() await trio.sleep(0.05) await ctx.asend(data) async def do_some_stuff(rep, req1, req2): async with trio.open_nursery() as n: ctx1, ctx2 = rep.new_contexts(2) n.start_soon(recv_and_send, ctx1) n.start_soon(recv_and_send, ctx2) await req1.asend(b'oh hi') await req2.asend(b'me toooo') assert (await req1.arecv() == b'oh hi') assert (await req2.arecv() == b'me toooo') with pynng.Rep0(listen=addr, recv_timeout=500) as rep, \ pynng.Req0(dial=addr, recv_timeout=500) as req1, \ pynng.Req0(dial=addr, recv_timeout=500) as req2: trio.run(do_some_stuff, rep, req1, req2)
def serve(address, np_convert): with pynng.Rep0(listen=address, recv_timeout=100, send_timeout=100) as rep: while True: try: # receive msg = rep.recv() # print(f"got message from client, {msg.decode()}") # print(f"total received byte size, {len(msg)}") if np_convert: input = np.frombuffer(msg, dtype=np.uint8) print(input.shape) # output output = np.zeros((1024), dtype=np.uint8).tobytes() # send rep.send(output) except pynng.Timeout: pass except KeyboardInterrupt: break except Exception: break
def __init__(self, port: int, handler) -> None: self._handler = handler self._node = pynng.Rep0() self._node.listen(f'tcp://0.0.0.0:{port}')