QUIKSharp icon indicating copy to clipboard operation
QUIKSharp copied to clipboard

Зависает при одновременном подключении двух инстансов

Open serebrennikovvitaly opened this issue 3 years ago • 10 comments

Собственно, проблема такая: запускаем 1 инстанс, (например Quik sharp Demo, жмем кнопку Connect), все ок.

Далее, запускам второй инстанс этого же приложения, также жмем Connect. И все, завис намертво.

Дебаг показывает, что виснет тут: image

Если еще ниже пройти, то виснет вот в этом месте: image

Можно ли поправить? Чтоб хотя бы на этапе создания экземпляра Quik возвращал null. Или как еще можно проверить, что порт занят другим подключением?

serebrennikovvitaly avatar Feb 14 '22 22:02 serebrennikovvitaly

  1. С какой целью Вы запускаете второй экземпляр приложения с коннектом на тот же порт? Очевидно же, что это и не должно работать.
  2. Предложите свое решение (в виде PR).

Pr0phet1c avatar Feb 15 '22 05:02 Pr0phet1c

Если Вам надо запустить более одного робота то на канале у Привала (https://github.com/finsight/QUIKSharp/issues/221) есть видео как это сделать с помощью activator.createinstance. я именно так делал

nick-ez avatar Feb 15 '22 07:02 nick-ez

  1. С какой целью Вы запускаете второй экземпляр приложения с коннектом на тот же порт? Очевидно же, что это и не должно работать.

Проблема в том, что иногда при установки соединения сам quik зависает и ничего не отдает, соответственно при перезапуске службы как-бы другой инстанс подключается к квику по этому же порту. Помогает только перезапуск квика полностью. Как решение (в теории) помог бы таймаут, добавленный в getWorkingFolder, и вообще во все обращения к квику

serebrennikovvitaly avatar Feb 20 '22 19:02 serebrennikovvitaly

Сделал на тесте так, предлагаю добавить в библиотеку:

image

image

image

serebrennikovvitaly avatar Feb 20 '22 20:02 serebrennikovvitaly

Эта проблема больше на стороне использования tpl. Если нет инстанса на порту для получения рабочей директории квика алгоритм уходит в лок. Рабочая директория нужна для MemoryMappedFile и генерации номера транзакции. Cделал решение - перейти на номер транзакции из Environment.TickCount64, тем более что MMF нет на линуксе. Если такое решение в парадигме проекта - мог сделать PR

dnmsk avatar May 15 '22 08:05 dnmsk

@dnmsk, К сожалению, я не могу назвать Ваше решение приемлемым. Суть вот в чем: С учетом ряда особенностей работы биржи по хранению данных о сделках и транзакциях, нам необходимо обеспечить уникальность номеров транзакций как минимум в течение двух суток. На самом деле, в ряде случаев, требуется больше, но это тот минимум на который можно пойти с минимальным риском. Предложенное Вами решение, по очевидным причинам НЕ обеспечивает такой уникальности, не только в течении двух суток, но даже в течение одного дня (если по каким-либо причинам система будет перезагружена).

Pr0phet1c avatar May 16 '22 06:05 Pr0phet1c

@Pr0phet1c Конечно, любое не привязанное к 1 знаменателю значение слабо подходит, время или тики со старта системы могут дублироваться. Другое дело что текущая реализация содержит 2 потенциальные трудности. Могу еще предложить самописный аналог mmf, лежащий в директории с программой (расположение квика и QUIKSharp также может быть на разных серверах). Либо подобие DI: с инжектом зависимости в конструктор генерирующей номер транзакции (для windows как есть, для линукс в директории исполнения программы) и возможностью написания своего варианта. Или ничего не делать :-)

dnmsk avatar May 16 '22 16:05 dnmsk

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

Pr0phet1c avatar May 16 '22 16:05 Pr0phet1c

Эта проблема больше на стороне использования tpl. Если нет инстанса на порту для получения рабочей директории квика алгоритм уходит в лок. Рабочая директория нужна для MemoryMappedFile и генерации номера транзакции.

Ну так может проще рабочую директорию квика просто передать через входящий параметр конструктора? Ну и таймаут все же добавить

serebrennikovvitaly avatar May 16 '22 21:05 serebrennikovvitaly

Ну так может проще рабочую директорию квика просто передать через входящий параметр конструктора? Ну и таймаут все же добавить

  1. На счет директории надо подумать, когда будет время.
  2. Решение с таймаутом, о котором Вы писали нерабочее. Почитайте справку Квика по функции getWorkongFolder. Она не принимает никаких параметров.

А пока рекомендую не создавать экземпляр объекта в заведомо нерабочей конфигурации системы.

Pr0phet1c avatar May 17 '22 06:05 Pr0phet1c