Я расскажу об особенностях асинхронного программирования на Python 3 и о своем опыте разработки микросервисов на Tornado и asyncio.
View Slide
2
3
4
5
6
7
8
9
10async def foo():return "Hello, world! I'm asynchronous.“async def bar():return "Hi! I'm asynchronous too."
11
12import asyncioasync def foo():await asyncio.sleep(100500)return 'DATA'async def bar():foo_result = await foo()return foo_result.lower()
13
14async def foo():return "Hello, world! I'm asynchronous."result = foo()print(result)
15async def foo():return "Hello, world! I'm asynchronous."result = foo()print(result)
16async def foo():return "Hello, world! I'm asynchronous."result = await foo()print(result)
17async def foo():return "Hello, world! I'm asynchronous."result = await foo()print(result)SyntaxError: invalid syntax
18from asyncio import get_event_loopasync def foo():return "Hello, world! I'm asynchronous."loop = get_event_loop()result = loop.run_until_complete(foo())print(result)
19from asyncio import get_event_loopasync 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.
20from asyncio import get_event_loopasync 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.
21from tornado.platform.asyncio import AsyncIOMainLoopasync def foo():return "Hello, world! I'm asynchronous."loop = AsyncIOMainLoop()result = loop.run_sync(foo)print(result)Hello, world! I’m asynchronous.
22from tornado.platform.asyncio import AsyncIOMainLoopasync def foo():return "Hello, world! I'm asynchronous."loop = AsyncIOMainLoop()result = loop.run_sync(foo)print(result)Hello, world! I’m asynchronous.
23from tornado.platform.asyncio import AsyncIOMainLoopfrom functools import partialasync 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.
24from tornado.platform.asyncio import AsyncIOMainLoopfrom functools import partialasync 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.
25
26from mock import patch, mockimport timedef 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'
27from mock import patch, mockimport timedef 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'
28from mock import patch, mockimport timedef 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'
29from mock import patch, mockimport pytestimport asyncioasync 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'
30from mock import mockdef 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 = mreturn mock_coroutine
31from mock import patch, mockimport pytestdef 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 = mreturn mock_coroutineasync def test_bar():patch('foo', new=async_mock(return_value='DATA'))assert await bar() == 'data'
32from mock import patch, mockimport pytestdef 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 = mreturn mock_coroutineasync def test_bar():patch('foo', new=async_mock(return_value='DATA'))assert await bar() == 'data'
33