Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Работа с ZeroMQ и PostgreSQL в asyncio

Anna | 15.06.2014 | нет комментариев
Наверное, все теснее слышали о Удивительной библиотеке asyncio?

Если нет, то коротко: эта либа стала эталоном на асинхронное сетевое программирование на Python. tornadoи twisted либо обучатся с ней трудиться либо понемногу уйдут в маргиналы.

asyncio красива, но это легко библиотека для работы с TCPUDPUNIX сокетами, PIPES и асинхронным запуском subprocess.

Дабы каждому было здорово необходимы сторонние библиотеки, умеющие трудиться с asyncio. Кое-что теснее есть, но немного.

Вот я с коллегами и сделал пару: одну для ZeroMQ и иную для PostgreSQL

Если вы крепко сидите на Python 2 и не интересуетесь Python 3 — не ходите под кат во избежание тупых вопросов и прочих недоразумений.

Для чего оно мне было нужно?

Потому что мы начинаем новейший план в котором без ZeroMQ и Postgress не обойтись. Дюже хочется делать на asyncio. Пришлось запилить недостающие ломтики.

Сразу скажу, обе либы качественные. Я Python Core Developer и в коде asyncio тоже есть много моего труда. Думаю, я осознал как отлично писать для системы, которую сам же помогал создавать.

Плюс (примерно) 100% покрытие кода обоих библиотек тестами и ясная (верю) документация.

aiozmq — разрешает применять ZeroMQ сокеты с asyncio.

Документация — тут.

aiozmq работает с низкоуровневыми ZeroMQ сокетами и, основное, даёт из коробки механизм Remote Procedure Call (плюс PubSub и Notify).

Короткий пример:

    import asyncio
    import aiozmq
    import aiozmq.rpc

    class ServerHandler(aiozmq.rpc.AttrHandler):
        @aiozmq.rpc.method
        def remote_func(self, a:int, b:int) -> int:
            return a   b

    @asyncio.coroutine
    def go():
        server = yield from aiozmq.rpc.start_server(
            ServerHandler(), bind='tcp://127.0.0.1:5555')
        client = yield from aiozmq.rpc.open_client(
            connect='tcp://127.0.0.1:5555')

        ret = yield from client.rpc.remote_func(1, 2)
        assert 3 == ret

        server.close()
        client.close()

    asyncio.set_event_loop_policy(aiozmq.ZmqEventLoopPolicy())
    asyncio.get_event_loop().run_until_complete(go())

Сейчас перейдем к aiopg

Эта либа может трудиться с psycopg2 в асинхронном режиме и в качестве славного бонуса даёт connection pool

Документация — тут.

    @asyncio.coroutine
    def test_select():
        pool = yield from aiopg.create_pool(dsn)

        with (yield from pool.cursor()) as cur:
            yield from cur.execute('SELECT 1')
            ret = yield from cur.fetchone()
            assert ret == (1,), ret

Обе библиотеки выложены на GitHub: aiozmq и aiopg

Пробуйте, если понравилось — используйте.

Обнаружите баги — пишите на гитхабе в issues, а ещё отменнее сразу делайте pull request

 Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB