powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / "Параллельные вычисления" - реализация С#
21 сообщений из 21, страница 1 из 1
"Параллельные вычисления" - реализация С#
    #38063373
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет "параллельных", возможно термин выбран не совсем удачно. Но элементы присутствуют.
Имеем COM-объект в котором происходят около 10-ка различных событий с частотой от нескольких в мин до десятков в сек.
Пока работаю с тремя из них.
Мы подписаны на эти события, и по каждому из них получаем некий поток данных, где-то около 10-20 как-то упакованных параметров. Уже понятно, что обработать их в реальном масштабе времени нереально. Поэтому обработчики событий сделаны оч легкими и просто преобразуют данные в объект и укладывают их в стек. Используется коллекция. (Реализовано)

Пока предполагается (нереализовано) , что организуем 3 потока, которые считывают [0] элемент коллекции (если таковой существует), удаляют его из коллекции и далее обрабатывают. Поток события в тоже самое время приостанавливает поток обработчика стека и кладет в коллекцию (стек) следующие элементы. И далее по кругу.
Собственно, мы получаем совместный доступ к изменению данных - 1. добавление элемента, запись 2.чтение, удаление элемента.
Нужна какая-то организация этого процесса, какие-то флаги и обмен ими. Приоритет у обработчика событий. Обработчик стека может и подождать.
Ничего вразумительного о построении таких систем пока не нашел. Ищу.
Если кто знает как это организуется, буду признателен за любую инфу.

"Есть многое на свете, друг Горацио, что и не сразу в голову придет."
М. Твен "Приключения Геккельбери Финна"
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38063538
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,

можно использовать готовые классы из пространства имен System.Collections.Concurrent .
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38063542
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAНасчет "параллельных", возможно термин выбран не совсем удачно. Но элементы присутствуют.
Имеем COM-объект в котором происходят около 10-ка различных событий с частотой от нескольких в мин до десятков в сек.
Пока работаю с тремя из них.
Мы подписаны на эти события, и по каждому из них получаем некий поток данных, где-то около 10-20 как-то упакованных параметров. Уже понятно, что обработать их в реальном масштабе времени нереально. Поэтому обработчики событий сделаны оч легкими и просто преобразуют данные в объект и укладывают их в стек. Используется коллекция. (Реализовано)

Пока предполагается (нереализовано) , что организуем 3 потока, которые считывают [0] элемент коллекции (если таковой существует), удаляют его из коллекции и далее обрабатывают. Поток события в тоже самое время приостанавливает поток обработчика стека и кладет в коллекцию (стек) следующие элементы. И далее по кругу.
Собственно, мы получаем совместный доступ к изменению данных - 1. добавление элемента, запись 2.чтение, удаление элемента.
Нужна какая-то организация этого процесса, какие-то флаги и обмен ими. Приоритет у обработчика событий. Обработчик стека может и подождать.
Ничего вразумительного о построении таких систем пока не нашел. Ищу.
Если кто знает как это организуется, буду признателен за любую инфу.

"Есть многое на свете, друг Горацио, что и не сразу в голову придет."
М. Твен "Приключения Геккельбери Финна"

См dataflow. Для подобных задач - то, что доктор ordered
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38063561
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile, SeVa, Спасибо, буду смотреть.
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38065397
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После прочтения глав Рихтера "CLR via C#", пока предварительно решил не связываться с синхронизацией потоков. Оч уж большие издержки при приостановке потоков, что у него (Рихтера) и написано.
Пока попробую следующее.
Потоку передается объект содержащий коллекцию ListArray, кол-во данных для считывания и флаги состояния потока.
После считывания заданного кол-ва данных поток устанавливает флаг окончания работы с коллекцией.
Основной поток события проверяет флаг, удаляет из начала коллекции уже ненужные считанные данные и передает потоку новое кол-во данных и флаг продолжения задачи.
Далее по кругу.
Один пишет, другой читает. Никакой конкуренции, синхронизации и приостановки потока.
Завтра (уже сегодня) начну делать.
Данных оказалось значительно больше, чем предполагалось. По каждому из событию приходит где-то до 500 параметров.
bazile , отдельное спасибо за книгу.
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38065444
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
ну у вас же была верная мысль в начале, стек, я бы конечно выбрал очередь ( первым поступил первым обработался)
ибо если голова будет расти и обработчик не будет успевать, нижние слои могут прокиснуть, в плане актуальности
просто залочте работу с очередью
у будут атомарные операции, поставить - выхватить из очереди. один поток пишет в голову другой читает с конца..
если будете брать потоки из пула, затрат на создание почти никаких.
Рихтер наверное это имел ввиду, даже если учесть, что приложение однопоточное всё равно планировщик будет его кое где рвать и потоку придется упаковываться в стек для продолжения, так что один или два потока, это экономия на спичках, в плане нагрузки на систему, операции работы с объектом как ни крути тоже будете делать в стеке потока, там вообще просто, смещение и память чиста, ну сам обьект из кучи - очистка памяти убьет когда надо, можете помочь в этом деле, что бы не вызывать конструктор отдиспозьте его (IDispose) в прочем не знаю в каком виде встают ваши задания в очередь..
единственное что можно подумать как поток обработчик ( по каким сигналам будет лазить в стек или в очередь) ну тут можно придумать кучу вариантов, я бы остановился на принципе как дышат соккеты..
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38065930
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAУже понятно, что обработать их в реальном масштабе времени нереально. Поэтому обработчики событий сделаны оч легкими и просто преобразуют данные в объект и укладывают их в стек. Используется коллекция. (Реализовано)
попробуйте просто порождать события асинхронно, т.е. типа ThreadPool.QueueUserWorkItem(FireYourEvent)
Где-то в степи уже сказал что пул потоков весьма шустр, не сомневаюсь что получится гораздо шустрей чем с использованием коллекции (обязательные локи).
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38066341
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи, LR Наверно немного не поняли, или я не понял. Событие постоянно кладет на верх ArrayList, поток постоянно читает снизу.
Событие передает потоку текущий размер коллекции, по флагу окончания цикла чтения потоком. И продолжает дополнять коллекцию сверху. Поток читает данные от 0 до переданного размера, выставляет флаг окончания чтения и уходит в бесконечный цикл до следующего получения размера коллекции. Событие по флагу окончания чтения удаляет уже считанные элементы ArrayList и опять передает потоку текущий размер. И по кругу.
Проблема c FIFO (класс Queue) м.б. в возможности одновременного добавлении элемента и удалении первого потоком и необходимости синхронизации этого момента.

А с пулом потоков, да, один из вариантов.
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38066374
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
Чем не нравится синхронизация ( основа работы с общими данными)?
вы хотите сказать что у вас ее нет? у вас ее еще больше, и она еще более запутана.
выкиньте ваш флаг, размер коллекции уже есть флаг, очередь пустая - обработчик крутится в холостую.
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38066379
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и почему у вас очередь очищают события, очередь должны очищать обработчики, -> выхватил обьект из очереди-> обработал его => снова полез проверять, есть ли для меня работа.
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38066389
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAСобытие постоянно кладет на верх ArrayList, поток постоянно читает снизу.
ну вот, и почему бы под каждую "кладку" не выделить свой поток? тогда этому потоку вроде как не надо ни с кем синхронизироваться, обработал "кладку" - и обратно в пул, не?
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38066393
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,
потому что пул потоков, имеет ограничения по количеству.
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38066401
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиLR,
потому что пул потоков, имеет ограничения по количеству.
ну и что? на что это повлияет?
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38066426
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,
в этой задаче ( конкретной этой- ни на что)
тут можно и тупо обойтись без всяких листов, и под каждый чих события, делать begininvoke
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38066438
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,
совершенно верно, если есть возможность засунуть "каждый чих" в отдельный поток, то так и следует поступать в условиях "в реальном масштабе времени"
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38066508
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRГде-то в степи,
совершенно верно, если есть возможность засунуть "каждый чих" в отдельный поток, то так и следует поступать в условиях "в реальном масштабе времени"То, что сейчас делаю, называется - "конвейер". Никакой конкуренции между событием и потоком просто не существует.
Если успевать не будет, буду думать о распараллеливании по потокам. А с пулом м.б. даже сегодня попробую.

ЗЫ СОМ-объект, зараза, по событию выдает мне не обновление, а всю, местами изменившуюся, таблицу параметров. Надо "виртуальную" БД делать, чтобы по insert-update только изменившиеся строки писать. Хотя все равно SQL-сервер цеплять. Вот и еще поток, в фоновом режиме в SQL-сервер инфу толкать. + пользовательские интефейсы, таблицы, алармы, графики, строить.
У National Instrumens есть среда LabView для подобных задач, но она здесь, к сожалению, не прокатывает.
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38066532
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAХотя все равно SQL-сервер цеплять. Вот и еще поток, в фоновом режиме в SQL-сервер инфу толкать.
хм... если это мсскл2008, то там есть табличные параметры и я бы попробовал эту "всю, местами изменившуюся, таблицу параметров" сразу отгружать скл-серверу (обрабатывать уже в хп)
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38066554
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
я подозреваю что вы пишете обработчик трейдерского стакана ( биржа)
там действительно прилетает с СОМ реальная таблица актуальных данных порядка 12-20 раз в секунд.
смею вас уверить никакого потока не надо, все делается в одном контексте, и вставляется в обыкновенный грид
как это исполнить я как то показывал, многие сетовали что грид тормозной, ничего подобного обновлялся в 20 раз в секунду
мало того я успевал разукрасить его, произвести кое какие расчеты, вставить в грид текущие заявки, и сделать анализ тренда, и все это на дух ядрах.
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38066743
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи, HFT пишу, пока модель для отработки. Кроме стакана, сделки + 1 мин ТФ. Не забудь, что это все еще обсчитывать надо.
Люди, вообще-то, спец. платы в компьютер вставляют. Народ на конференции по алготрейдингу говорил, что Винда не успевает, но подробности, ясно дело, никто не говорит.
Судя по уже полученным таблицам, сделок в обычном режиме где-то ~50/c. Вся таблица где-то ~500 строк.
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38066786
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
высокочастотную торговлю, по интернету, хм, жалко ..
как вы себе представляете, с нестабильной плазой, с недостоверными данными ( почитайте редбула), конце концов с простым обманом, когда меркетмейкеры встают просто перед вами, хотя биржа и предлагает размещать высокочастотные роботы у себя на площадке ( напрямую) вызывает сомнение.( в стране где все построено на обмане вдруг появилась честная биржа с честным регулятором, один штраф которого 10 000 рублей за не добросовестные проведение следок, вызывает нервный хохот)
а по теме, как вы это себе представляете, приходит информация с сом, вы всю обработку засовываете в отдельный поток
поток обрабатывает дает сигнал в лонг, а там уже далеко не лонг - уже в это время прострелило 8-10 событий и тренд против вас.
Всю обработку надо делать в контексте события сома, а не разбрасывать по разным потокам.
не хватает мощи, расширяйте железо, подключайте видеокарту
...
Рейтинг: 0 / 0
"Параллельные вычисления" - реализация С#
    #38066868
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиYUBA,
высокочастотную торговлю, по интернету, хм, жалко ..
как вы себе представляете, с нестабильной плазой, с недостоверными данными ( почитайте редбула), конце концов с простым обманом, когда меркетмейкеры встают просто перед вами, хотя биржа и предлагает размещать высокочастотные роботы у себя на площадке ( напрямую) вызывает сомнение.( в стране где все построено на обмане вдруг появилась честная биржа с честным регулятором, один штраф которого 10 000 рублей за не добросовестные проведение следок, вызывает нервный хохот)
а по теме, как вы это себе представляете, приходит информация с сом, вы всю обработку засовываете в отдельный поток
поток обрабатывает дает сигнал в лонг, а там уже далеко не лонг - уже в это время прострелило 8-10 событий и тренд против вас.
Всю обработку надо делать в контексте события сома, а не разбрасывать по разным потокам.
не хватает мощи, расширяйте железо, подключайте видеокарту
1.Не надо лезть на фьюч РТС, там этих HFT как грязи. И я им не конкурент, по определению. :)
2. Фьючи ГП И Сбер тоже весьма неплохие инструменты, и более спокойные. Даже руками вполне успеваешь пипсовать - минимум 400-500 п за день, это если в струю не попадешь, но оч утомительно, да и время занимает. И, в общем, практически нереально заниматься постоянно. Только в порядке хобби.
3. Конвеерные вычисления всегда были наиболее быстрыми, а удалить низ коллекции и поднять флаг, времени вообще не занимает, по сравнению с управлением потоками. Тот-же Рихтер пишет, что времени на это уходит уйма и рекомендует по возможности разделять доступ - один только запись - другой только чтение. Что и реализовано. А вот если монопоток чего-то не успеет, мы вообще часть событий потеряем. Событий, кстати, около десятка предполагается.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / "Параллельные вычисления" - реализация С#
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]