Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
serebrennikovvitaly opened this issue Feb 14, 2022 · 10 comments

Comments

@serebrennikovvitaly
Copy link

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

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

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

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

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

@Pr0phet1c
Copy link
Collaborator

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

@nick-ez
Copy link

nick-ez commented Feb 15, 2022

Если Вам надо запустить более одного робота то на канале у Привала (#221) есть видео как это сделать с помощью activator.createinstance. я именно так делал

@serebrennikovvitaly
Copy link
Author

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

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

@serebrennikovvitaly
Copy link
Author

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

image

image

image

@dnmsk
Copy link

dnmsk commented May 15, 2022

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

@Pr0phet1c
Copy link
Collaborator

Pr0phet1c commented May 16, 2022

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

@dnmsk
Copy link

dnmsk commented May 16, 2022

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

@Pr0phet1c
Copy link
Collaborator

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

@serebrennikovvitaly
Copy link
Author

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

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

@Pr0phet1c
Copy link
Collaborator

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants