Изображение блога
Алексей Ван <o-s-a.net>
Алексей Ван <o-s-a.net> Блог компании Os_Engine
16 декабря 2023, 19:54

Стандарты кода #6. Многопоточность. Task, Asуnc. Коннекторы для OsEngine #25.

OsEngine невозможно ускорить многопоточностью в коннекторе. 98% всех задержек находятся в самих роботах. И от того, как их пишут пользователи, зависит скорость работы программы.

Стандарты кода #6. Многопоточность. Task, Asуnc. Коннекторы для OsEngine #25.

Так было не всегда… Были времена, когда казалось, что это не так. Но годы шли, OsEngine шлифовался и ускорялся. С модификацией Aserver, журналов и прочего всё больше становилось очевидно, что задержки именно в роботах.

На сегодняшний момент, даже подписка на 200 или 400 бумаг не ложат стандартную поточную архитектуру сервера, предложенную ниже.

Поэтому делаем, как тут написано. Время экспериментов закончено.

 

 

Один коннектор – оптимально два потока.

 

Полный и достаточный список потоков, которые могут и должны быть в любом сервере:

  1. Проверка жизни Вёбсокета. Это поток номер один. Если есть вёбСокет, данный поток должен быть в обязательном порядке.
  2. Конвертер сообщений. Поток номер два. В бесконечном цикле занимается разбором входящих сообщений от биржи/брокера.

Никакие другие потоки создавать не нужно. Только если этого требует само АПИ. Плюс, это должен быть THREAD, а не Task.

 

 

Использование Task запрещено. Асинхронные методы запрещены.

 

Это сделано исключительно из-за того, что молодые программисты начинают делать гирлянду из асинхронных вызовов. Лучше не использовать данный подход к программированию коннекторов совсем. Не припомню ни одного случая, когда бы мне не пришлось переписывать код коннектора, в котором были Task и async.

Напомню, что ускорить процесс работы программы не выйдет. Однако, запросто можно сделать коннектор нерабочим, неподдерживаемым.

Если в коннекторе зачем-то в юзингах указан Threading.Tasks, такой коннектор принят не будет.

 

 

Поток рассылки и разбора сообщений спит, только если очередь пустая.

 

Это очень важное правило. Не заставляйте поток спать, когда в очереди есть данные. Это трудноуловимая логическая ошибка, которая приведёт к потере скорости у людей, которые торгуют очень много источников одновременно.

Стандарты кода #6. Многопоточность. Task, Asуnc. Коннекторы для OsEngine #25.

 

Поток конвертации разбирает сообщения об ордерах и myTrade в первую очередь.

Если кол-во очередей не ограничено одной, следует разбирать очереди, начиная с ордеров.

 

Что почитать?

  1. https://habr.com/ru/companies/dododev/articles/435666/
  2. https://ru.stackoverflow.com/questions/947503/task-run-антипаттерн-async-await-c

 

Пост из серии «Коннекторы к OsEngine»

Серия о том, как стать настоящим программистом и изменить свою профессию.

Оглавление и смыслы здесь: https://smart-lab.ru/company/os_engine/blog/959953.php

Комментарии открыты для друзей, добавляйтесь!

Стандарты кода #6. Многопоточность. Task, Asуnc. Коннекторы для OsEngine #25.

OsEngine: https://github.com/AlexWan/OsEngine
Поддержка OsEngine: https://t.me/osengine_official_support

Регистрируйся в АЛОР и получай бонусы: https://www.alorbroker.ru/open
Сайт АЛОР БРОКЕР: https://www.alorbroker.ru
Раздел «Для клиентов»: https://www.alorbroker.ru/openinfo/for-clients

Стандарты кода #6. Многопоточность. Task, Asуnc. Коннекторы для OsEngine #25.

4 Комментария
  • Тихий омут
    16 декабря 2023, 21:42

    Что дает Sleep на 1 миллисекунду, и почему без него не обойтись?

    Пока очередь пуста все равно по циклу ждем, зачем еще милисекунду добавлять ожидания?


    Я спрашиваю, чтоб как то новичкам понять назначение строк кода.
      • Дмитрий Челяпин
        17 декабря 2023, 12:09
        Алексей Ван <o-s-a.net>, асинхронный API даст преимущество в случае большого количества IO операций(что в данном случае ей и является — ожидания данных из сети) особенно в высоконагруженных приложениях. Да, грамотное использование данного API накладывает определенные ограничения на квалификацию разработчика, но сказать что это антипаттерн некорректно.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн