Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Александр Жилин. Асинхронный Python глазами новичка

Александр Жилин. Асинхронный Python глазами новичка

Я расскажу об особенностях асинхронного программирования на Python 3 и о своем опыте разработки микросервисов на Tornado и asyncio.

Python Community Chelyabinsk

October 21, 2017
Tweet

More Decks by Python Community Chelyabinsk

Other Decks in Programming

Transcript

  1. View Slide

  2. 2

    View Slide

  3. 3

    View Slide

  4. 4

    View Slide

  5. 5

    View Slide

  6. 6

    View Slide

  7. 7

    View Slide

  8. 8

    View Slide

  9. 9

    View Slide

  10. 10
    async def foo():
    return "Hello, world! I'm asynchronous.“
    async def bar():
    return "Hi! I'm asynchronous too."

    View Slide

  11. 11

    View Slide

  12. 12
    import asyncio
    async def foo():
    await asyncio.sleep(100500)
    return 'DATA'
    async def bar():
    foo_result = await foo()
    return foo_result.lower()

    View Slide

  13. 13

    View Slide

  14. 14
    async def foo():
    return "Hello, world! I'm asynchronous."
    result = foo()
    print(result)

    View Slide

  15. 15
    async def foo():
    return "Hello, world! I'm asynchronous."
    result = foo()
    print(result)

    View Slide

  16. 16
    async def foo():
    return "Hello, world! I'm asynchronous."
    result = await foo()
    print(result)

    View Slide

  17. 17
    async def foo():
    return "Hello, world! I'm asynchronous."
    result = await foo()
    print(result)
    SyntaxError: invalid syntax

    View Slide

  18. 18
    from asyncio import get_event_loop
    async def foo():
    return "Hello, world! I'm asynchronous."
    loop = get_event_loop()
    result = loop.run_until_complete(foo())
    print(result)

    View Slide

  19. 19
    from asyncio import get_event_loop
    async def foo():
    return "Hello, world! I'm asynchronous."
    loop = get_event_loop()
    result = loop.run_until_complete(foo())
    print(result)
    Hello, world! I’m asynchronous.

    View Slide

  20. 20
    from asyncio import get_event_loop
    async def foo():
    return "Hello, world! I'm asynchronous."
    loop = get_event_loop()
    result = loop.run_until_complete(foo())
    print(result)
    Hello, world! I’m asynchronous.

    View Slide

  21. 21
    from tornado.platform.asyncio import AsyncIOMainLoop
    async def foo():
    return "Hello, world! I'm asynchronous."
    loop = AsyncIOMainLoop()
    result = loop.run_sync(foo)
    print(result)
    Hello, world! I’m asynchronous.

    View Slide

  22. 22
    from tornado.platform.asyncio import AsyncIOMainLoop
    async def foo():
    return "Hello, world! I'm asynchronous."
    loop = AsyncIOMainLoop()
    result = loop.run_sync(foo)
    print(result)
    Hello, world! I’m asynchronous.

    View Slide

  23. 23
    from tornado.platform.asyncio import AsyncIOMainLoop
    from functools import partial
    async def bar(username):
    return f"Hello, {username}! I'm asynchronous."
    loop = AsyncIOMainLoop()
    result = loop.run_sync(partial(bar, 'Vasya'))
    print(result)
    Hello, Vasya! I’m asynchronous.

    View Slide

  24. 24
    from tornado.platform.asyncio import AsyncIOMainLoop
    from functools import partial
    async def bar(username):
    return f"Hello, {username}! I'm asynchronous."
    loop = AsyncIOMainLoop()
    result = loop.run_sync(partial(bar, 'Vasya'))
    print(result)
    Hello, Vasya! I’m asynchronous.

    View Slide

  25. 25

    View Slide

  26. 26
    from mock import patch, mock
    import time
    def foo():
    time.sleep(100500)
    return 'DATA'
    def bar():
    foo_result = foo()
    return foo_result.lower()
    ...
    def test_bar():
    patch('foo', new=mock.MagicMock(return_value='DATA'))
    assert bar() == 'data'

    View Slide

  27. 27
    from mock import patch, mock
    import time
    def foo():
    time.sleep(100500)
    return 'DATA'
    def bar():
    foo_result = foo()
    return foo_result.lower()
    ...
    def test_bar():
    patch('foo', new=mock.MagicMock(return_value='DATA'))
    assert bar() == 'data'

    View Slide

  28. 28
    from mock import patch, mock
    import time
    def foo():
    time.sleep(100500)
    return 'DATA'
    def bar():
    foo_result = foo()
    return foo_result.lower()
    ...
    def test_bar():
    patch('foo', new=mock.MagicMock(return_value='DATA'))
    assert bar() == 'data'

    View Slide

  29. 29
    from mock import patch, mock
    import pytest
    import asyncio
    async def foo():
    await asyncio.sleep(100500)
    return 'DATA'
    async def bar():
    foo_result = await foo()
    return foo_result.lower()
    ...
    async def test_bar():
    patch('foo', new=mock.MagicMock(return_value='DATA'))
    assert await bar() == 'data'

    View Slide

  30. 30
    from mock import mock
    def async_mock(*args, **kwargs):
    m = mock.MagicMock(*args, **kwargs)
    async def mock_coroutine(*inner_args, **inner_kwargs):
    return m(*inner_args, **inner_kwargs)
    mock_coroutine.mock = m
    return mock_coroutine

    View Slide

  31. 31
    from mock import patch, mock
    import pytest
    def async_mock(*args, **kwargs):
    m = mock.MagicMock(*args, **kwargs)
    async def mock_coroutine(*inner_args, **inner_kwargs):
    return m(*inner_args, **inner_kwargs)
    mock_coroutine.mock = m
    return mock_coroutine
    async def test_bar():
    patch('foo', new=async_mock(return_value='DATA'))
    assert await bar() == 'data'

    View Slide

  32. 32
    from mock import patch, mock
    import pytest
    def async_mock(*args, **kwargs):
    m = mock.MagicMock(*args, **kwargs)
    async def mock_coroutine(*inner_args, **inner_kwargs):
    return m(*inner_args, **inner_kwargs)
    mock_coroutine.mock = m
    return mock_coroutine
    async def test_bar():
    patch('foo', new=async_mock(return_value='DATA'))
    assert await bar() == 'data'

    View Slide

  33. 33

    View Slide

  34. View Slide