コード例 #1
0
ファイル: test_sync.py プロジェクト: xyicheng/thredo
def test_lock_race():
    lock = thredo.Lock()
    evt = thredo.Event()
    n = 0
    def incr(count):
        nonlocal n
        evt.wait()
        while count > 0:
            with lock:
                n += 1
            count -=1
            
    def decr(count):
        nonlocal n
        evt.wait()
        while count > 0:
            with lock:
                n -= 1
            count -= 1

    def main():
        t1 = thredo.spawn(incr, 10000)
        t2 = thredo.spawn(decr, 10000)
        evt.set()
        t1.join()
        t2.join()

    thredo.run(main)
    assert n == 0
コード例 #2
0
ファイル: test_io.py プロジェクト: xyicheng/thredo
def test_sendall_cancel():
    evt = thredo.Event()
    start = thredo.Event()
    results = {}

    def server(address):
        sock = socket(AF_INET, SOCK_STREAM)
        sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, True)
        sock.bind(address)
        sock.listen(1)
        evt.set()
        client, addr = sock.accept()
        try:
            start.wait()
            nrecv = 0
            while True:
                data = client.recv(1000000)
                if not data:
                    break
                nrecv += len(data)
            results['handler'] = nrecv
        finally:
            client.close()
            sock.close()

    def test_client(address):
        evt.wait()
        sock = socket(AF_INET, SOCK_STREAM)
        sock.connect(address)
        try:
            sock.sendall(b'x'*10000000)
        except thredo.ThreadCancelled as e:
            results['sender'] = e.bytes_sent
        sock.close()

    def main():
        serv = thredo.spawn(server, ('', 25000))
        client = thredo.spawn(test_client, ('localhost', 25000))
        thredo.sleep(0.1)
        client.cancel()
        start.set()
        serv.join()

    thredo.run(main)

    assert results['handler'] == results['sender']
コード例 #3
0
ファイル: test_io.py プロジェクト: xyicheng/thredo
def test_readall():
    results = []
    evt = thredo.Event()

    def server(address):
        sock = socket(AF_INET, SOCK_STREAM)
        sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, True)
        sock.bind(address)
        sock.listen(1)
        evt.set()
        client, addr = sock.accept()
        try:
            results.append('handler start')
            client.send(b'OK')
            with client.as_stream() as s:
                data = s.readall()
                results.append(data)
                results.append('handler done')
        finally:
            client.close()
            sock.close()

    def test_client(address):
        evt.wait()
        sock = socket(AF_INET, SOCK_STREAM)
        sock.connect(address)
        sock.recv(8)
        sock.send(b'Msg1\n')
        thredo.sleep(0.1)
        sock.send(b'Msg2\n')
        thredo.sleep(0.1)
        sock.send(b'Msg3\n')
        thredo.sleep(0.1)
        sock.close()

    def main():
        serv = thredo.spawn(server, ('',25000))
        client = thredo.spawn(test_client, ('localhost', 25000))
        serv.join()
        client.join()

    thredo.run(main)

    assert results == [
        'handler start',
        b'Msg1\nMsg2\nMsg3\n',
        'handler done'
    ]
コード例 #4
0
ファイル: test_io.py プロジェクト: xyicheng/thredo
def test_readlines_timeout():
    evt = thredo.Event()
    results = []

    def server(address):
        sock = socket(AF_INET, SOCK_STREAM)
        sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, True)
        sock.bind(address)
        sock.listen(1)
        evt.set()
        client, addr = sock.accept()
        try:
            client.send(b'OK')
            results.append('handler start')
            s = client.as_stream()
            try:
                thredo.timeout_after(0.5, s.readlines)
            except thredo.ThreadTimeout as e:
                results.extend(e.lines_read)
            results.append('handler done')
        finally:
            client.close()
            sock.close()

    def test_client(address):
        evt.wait()
        sock = socket(AF_INET, SOCK_STREAM)
        sock.connect(address)
        sock.recv(8)
        sock.send(b'Msg1\nMsg2\n')
        thredo.sleep(1)
        sock.send(b'Msg3\n')
        sock.close()

    def main():
        serv = thredo.spawn(server, ('', 25000))
        client = thredo.spawn(test_client, ('localhost', 25000))
        serv.join()
        client.join()

    thredo.run(main)

    assert results == [
        'handler start',
        b'Msg1\n',
        b'Msg2\n',
        'handler done'
    ]
コード例 #5
0
ファイル: test_io.py プロジェクト: xyicheng/thredo
def test_writelines_timeout():
    evt = thredo.Event()
    results = []
    def server(address):
        sock = socket(AF_INET, SOCK_STREAM)
        sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, True)
        sock.bind(address)
        sock.listen(1)
        evt.set()
        client, addr = sock.accept()
        try:
            client.send(b'OK')
            s = client.as_stream()
            thredo.sleep(1)
            results.append(s.readall())
        finally:
            client.close()
            sock.close()

    def line_generator():
        n = 0
        while True:
            yield b'Msg%d\n' % n
            n += 1

    def test_client(address):
        evt.wait()
        sock = socket(AF_INET, SOCK_STREAM)
        sock.connect(address)
        sock.recv(8)
        s = sock.as_stream()
        try:
            thredo.timeout_after(0.5, s.writelines, line_generator())
        except thredo.ThreadTimeout as e:
            results.append(e.bytes_written)
        sock.close()

    def main():
        serv = thredo.spawn(server, ('', 25000))
        client = thredo.spawn(test_client, ('localhost', 25000))
        serv.join()
        client.join()

    thredo.run(main)

    assert results[0] == len(results[1])
コード例 #6
0
ファイル: test_sync.py プロジェクト: xyicheng/thredo
def test_event_wait_cancel():
    evt = thredo.Event()
    result = []
    def waiter():
        try:
            evt.wait()
            result.append('waiter')
        except thredo.ThreadCancelled:
            result.append('cancel')
        
    def main():
        t = thredo.spawn(waiter)
        result.append('start')
        t.cancel()
        
    thredo.run(main)
    assert result == ['start', 'cancel']
コード例 #7
0
ファイル: test_sync.py プロジェクト: xyicheng/thredo
def test_event_wait():
    evt = thredo.Event()
    result = []
    def waiter():
        evt.wait()
        result.append('waiter')
        
    def main():
        t = thredo.spawn(waiter)
        result.append('start')
        evt.set()
        t.join()
        
    thredo.run(main)
    assert result == ['start', 'waiter']
    evt.clear()
    assert not evt.is_set() 
コード例 #8
0
ファイル: test_io.py プロジェクト: xyicheng/thredo
def test_write_timeout():
    evt = thredo.Event()
    results = []
    def server(address):
        sock = socket(AF_INET, SOCK_STREAM)
        sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, True)
        sock.bind(address)
        sock.listen(1)
        evt.set()
        client, addr = sock.accept()
        try:
            client.send(b'OK')
            s = client.as_stream()
            thredo.sleep(1)
            results.append(s.readall())
        finally:
            client.close()
            sock.close()

    def test_client(address):
        evt.wait()
        sock = socket(AF_INET, SOCK_STREAM)
        sock.connect(address)
        sock.recv(8)
        s = sock.as_stream()
        try:
            msg = b'x'*10000000  # Must be big enough to fill buffers
            thredo.timeout_after(0.5, s.write, msg)
        except thredo.ThreadTimeout as e:
            results.append(e.bytes_written)
        sock.close()

    def main():
        serv = thredo.spawn(server, ('', 25000))
        client = thredo.spawn(test_client, ('localhost', 25000))
        serv.join()
        client.join()

    thredo.run(main)

    assert results[0] == len(results[1])
コード例 #9
0
ファイル: test_io.py プロジェクト: xyicheng/thredo
def test_readall_partial():
    results = []
    evt = thredo.Event()

    def server(address):
        sock = socket(AF_INET, SOCK_STREAM)
        sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, True)
        sock.bind(address)
        sock.listen(1)
        evt.set()
        client, addr = sock.accept()
        try:
            client.send(b'OK')
            s = client.as_stream()
            line = s.readline()
            results.append(line)
            data = s.readall()
            results.append(data)
            s.close()
        finally:
            client.close()

    def test_client(address):
        evt.wait()
        sock = socket(AF_INET, SOCK_STREAM)
        sock.connect(address)
        sock.recv(8)
        sock.send(b'hello\nworld\n')
        sock.close()

    def main():
        serv = thredo.spawn(server, ('',25000))
        client = thredo.spawn(test_client, ('localhost', 25000))
        serv.join()
        client.join()

    thredo.run(main)
    assert results == [b'hello\n', b'world\n']
コード例 #10
0
ファイル: test_io.py プロジェクト: xyicheng/thredo
def test_read_exactly_incomplete():
    evt = thredo.Event()
    results = []
    def server(address):
        sock = socket(AF_INET, SOCK_STREAM)
        sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, True)
        sock.bind(address)
        sock.listen(1)
        evt.set()
        client, addr = sock.accept()
        try:
            client.send(b'OK')
            s = client.as_stream()
            try:
                s.read_exactly(100)
            except EOFError as e:
                results.append(e.bytes_read)
        finally:
            client.close()
            sock.close()

    def test_client(address):
        evt.wait()
        sock = socket(AF_INET, SOCK_STREAM)
        sock.connect(address)
        sock.recv(8)
        sock.send(b'Msg1\nMsg2\nMsg3\n')
        sock.close()

    def main():
        serv = thredo.spawn(server, ('', 25000))
        client = thredo.spawn(test_client, ('localhost', 25000))
        serv.join()
        client.join()

    thredo.run(main)

    assert results[0] ==  b'Msg1\nMsg2\nMsg3\n'
コード例 #11
0
        print('T-minus', n)
        thredo.sleep(1)
        n -= 1


def friend(name):
    print('Hi, my name is', name)
    print('Playing Minecraft')
    try:
        thredo.sleep(1000)
    except thredo.CancelledError:
        print(name, 'going home')
        raise


start_evt = thredo.Event()


def kid():
    while True:
        try:
            print('Can I play?')
            thredo.timeout_after(1, start_evt.wait)
            break
        except thredo.ThreadTimeout:
            print('Wha!?!')

    print('Building the Millenium Falcon in Minecraft')
    with thredo.ThreadGroup() as f:
        f.spawn(friend, 'Max')
        f.spawn(friend, 'Lillian')