Example #1
0
    def test_condition(self):
        print()
        cv = threading.Condition()

        items = []

        def produce():
            print('start produce()')
            with cv:
                for i in range(10):
                    items.append(i)
                    print('yield from produce()')
                    gyield()

                print('notify')
                cv.notify()
            print('done produce()')

        def consume():
            print('start consume()')
            with cv:
                while not len(items) == 10:
                    print('wait ({}/{})'.format(len(items), 10))
                    cv.wait()

                print('items: {}'.format(len(items)))
            print('done consume()')

        spawn(produce)
        spawn(consume)

        print('switch to hub')
        gyield(False)
        print('done test')
Example #2
0
    def test_send_timeout(self, gsock, server_sock):
        resize_buffer(server_sock, 1)
        evt = Event()

        def server():
            client_sock, addr = server_sock.accept()
            resize_buffer(client_sock, 1)
            evt.wait()

        g = spawn(server)

        server_addr = server_sock.getsockname()
        resize_buffer(gsock, 1)
        gsock.connect(server_addr)
        gsock.settimeout(TIMEOUT_SMALL)

        with pytest.raises(socket.timeout):
            # large enough data to overwhelm most buffers
            msg_len = 10 ** 6
            sent = 0

            while sent < msg_len:
                sent += gsock.send(bytes(msg_len))

        evt.send()
        g.wait()
Example #3
0
    def test_send_timeout(self, gsock, server_sock):
        resize_buffer(server_sock, 1)
        evt = Event()

        def server():
            client_sock, addr = server_sock.accept()
            resize_buffer(client_sock, 1)
            evt.wait()

        g = spawn(server)

        server_addr = server_sock.getsockname()
        resize_buffer(gsock, 1)
        gsock.connect(server_addr)
        gsock.settimeout(TIMEOUT_SMALL)

        with pytest.raises(socket.timeout):
            # large enough data to overwhelm most buffers
            msg_len = 10 ** 6
            sent = 0

            while sent < msg_len:
                sent += gsock.send(bytes(msg_len))

        evt.send()
        g.wait()
Example #4
0
    def run(self):
        acceptors = []
        for sock in self.sockets:
            gsock = gsocket(sock.FAMILY, socket.SOCK_STREAM, fileno=sock.fileno())
            gsock.setblocking(1)
            hfun = partial(self.handle, gsock)
            acceptor = guv.spawn(_guv_serve, gsock, hfun, self.worker_connections)

            acceptors.append(acceptor)
            guv.gyield()

        try:
            while self.alive:
                self.notify()
                guv.sleep(self.timeout / 2)

        except (KeyboardInterrupt, SystemExit):
            log.debug('KeyboardInterrupt, exiting')

        self.notify()
        try:
            with guv.Timeout(self.cfg.graceful_timeout) as t:
                for a in acceptors:
                    a.kill(guv.StopServe())

                for a in acceptors:
                    a.wait()
        except guv.Timeout as te:
            if te != t:
                raise

            for a in acceptors:
                a.kill()

        log.debug('GuvWorker exited')
Example #5
0
    def test_del_closes_socket(self, gsock, server_sock):
        def accept_once(sock):
            # delete/overwrite the original conn object, only keeping the file object around
            # closing the file object should close everything
            try:
                client_sock, addr = sock.accept()
                file = client_sock.makefile('wb')
                del client_sock
                file.write(b'hello\n')
                file.close()
                gc.collect()
                with pytest.raises(ValueError):
                    file.write(b'a')
            finally:
                sock.close()

        killer = spawn(accept_once, server_sock)
        gsock.connect(('127.0.0.1', server_sock.getsockname()[1]))
        f = gsock.makefile('rb')
        gsock.close()
        assert f.read() == b'hello\n'
        assert f.read() == b''
        killer.wait()
Example #6
0
    def test_del_closes_socket(self, gsock, server_sock):
        def accept_once(sock):
            # delete/overwrite the original conn object, only keeping the file object around
            # closing the file object should close everything
            try:
                client_sock, addr = sock.accept()
                file = client_sock.makefile("wb")
                del client_sock
                file.write(b"hello\n")
                file.close()
                gc.collect()
                with pytest.raises(ValueError):
                    file.write(b"a")
            finally:
                sock.close()

        killer = spawn(accept_once, server_sock)
        gsock.connect(("127.0.0.1", server_sock.getsockname()[1]))
        f = gsock.makefile("rb")
        gsock.close()
        assert f.read() == b"hello\n"
        assert f.read() == b""
        killer.wait()