15.11.2017, 15:24 | #1 |
Гость
|
Синхронизация потоков в АХ7
Здравствуйте,
Подскажите пожалуйста как правильно делать синхроницазию потоков в АХ7. Есть несколько методов которые запущены асинхронно через Global::runAsync, и нужно результат этих методов записывать в некий список : static List list; static Object locker; ... try { System.Threading.Monitor::Enter(locker); list.addEnd(returnValue); } finally { System.Threading.Monitor::Exit(locker); } в результате список пуст, может кто-то сталкивался |
|
15.11.2017, 15:27 | #2 |
Участник
|
|
|
15.11.2017, 15:45 | #3 |
Гость
|
А как тогда создавать обьекты которые можна изменять в разных потоках? В С# есть volitile переменные, я думаю что и в Х++ должна быть схожая функциональность...
|
|
15.11.2017, 16:38 | #4 |
Участник
|
Цитата:
Почему именно список? |
|
|
За это сообщение автора поблагодарили: trud (2). |
15.11.2017, 17:16 | #5 |
Участник
|
X++ создавался совершенно для других целей. Так что не думаю, что не должна.
Если надо что-то этакое, можно написать на C# (правда, как это паковать и развертывать клиенту я не знаю). Присоединяюсь к вопросу mazzy |
|
15.11.2017, 17:17 | #6 |
Гость
|
|
|
15.11.2017, 17:28 | #7 |
Участник
|
Цитата:
Многопоточное и не имеющее доступа к базе данных. Аксапта - многопользовательское приложение, которое хранит свои данные в единой базе данных. База данных в аксапте - самый естественный способ хранить данные из разных сессий/потоков. |
|
|
За это сообщение автора поблагодарили: (1). |
15.11.2017, 17:46 | #8 |
Гость
|
Цитата:
Сообщение от mazzy
Что вы такое делаете?
Многопоточное и не имеющее доступа к базе данных. Мне не хотелось бы просто писать в таблицы. Спасибо за ответ! |
|
15.11.2017, 17:53 | #9 |
Участник
|
в акс7 есть класс SysGlobalObjectCache. он синхронизирует хранимые данные между сессиями. но ничего не гарантирует.
Не перепутайте с SysGlobalCache. Этот хранит только внутри сессии. посмотрите как используется. и не делайте так. побочные эффекты такого лечения хуже болезни. храните межсессионные данные в таблицах. а уж бд будет заботиться и о тразакционной целостности, и о валидации и о блокировках и о производительности. |
|
16.11.2017, 04:02 | #10 |
Участник
|
Подозреваю что ваша цель - это ускорить какую-то операцию за счет разбития ее на куски и параллельного выполнения?
если так, то есть отличная статья как это делать https://blogs.msdn.microsoft.com/axp...-in-ax-part-i/ |
|
|
За это сообщение автора поблагодарили: mazzy (2), belugin (5), AlGol (2), Sergey Petrov (1). |
16.11.2017, 20:49 | #11 |
Banned
|
Цитата:
Сообщение от trud
Подозреваю что ваша цель - это ускорить какую-то операцию за счет разбития ее на куски и параллельного выполнения?
если так, то есть отличная статья как это делать https://blogs.msdn.microsoft.com/axp...-in-ax-part-i/ Присоединюсь к тем что кто советует любой ценой избегать прямой работы с threads будь то AX5, 6 или 7. Код такой писать как бы можно, но абсолютно противопоказано. Просто забудьте о такой возможности чтобы там ни было написано в msdn. Thread Class https://msdn.microsoft.com/en-us/library/thread.aspx |
|
17.11.2017, 03:10 | #12 |
Banned
|
На одном из проектов AX2009 в который меня пригласили разгребать, очень неплохие вдумчивые программисты C# весь основной фунционал сопряжения с конвейером написали как раз на потоках используя X++. В результате если AOS не падал пару раз за день, то значит это был выходной. А все из-за того что искали аналоги, а о существовании пакетных запусков (batch jobs) просто не подозревали.
И это не значит что AX плохая, это значит что категорически нельзя приходить со своим багажом. Что положено то выдадут, а все остальное в топку. В принципе как и в любой новой для программиста системе. C другой стороны AX7 подразумевает другую среду выполнения и другое окружение, но мне все равно было бы страшно программировать на потоках до тех пор пока не было бы очевидно что данный подход является стандартным и общепринятым. Наличия возможностей языка - недостаточно, так как все упирается в надежность среды выполнения. AOCы они и так достаточно падучие. Ослиный мостик эти потоки. |
|
|
За это сообщение автора поблагодарили: eugene egorov (2), Logger (1). |
17.11.2017, 14:42 | #13 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: Logger (2), ax_mct (2). |
17.11.2017, 16:55 | #14 |
Гость
|
Цитата:
Сообщение от ax_mct
Статья про использование batch framework без прямой работы с потоками (то есть с threads). И это хорошо.
Присоединюсь к тем что кто советует любой ценой избегать прямой работы с threads будь то AX5, 6 или 7. Код такой писать как бы можно, но абсолютно противопоказано. Просто забудьте о такой возможности чтобы там ни было написано в msdn. Thread Class https://msdn.microsoft.com/en-us/library/thread.aspx Спасибо Последний раз редактировалось Rardd; 17.11.2017 в 17:00. |
|
18.11.2017, 13:04 | #15 |
Banned
|
Rardd, в ваших словах мелькает слово
"нужно". И то что нормальный подход с записью в таблицу - это "время". Если это ваши собственные эксперименты в песочнице то это одно, но если это бизнес-требования то не могли бы вы ими поделиться. Возможно мы предложим достойные альтернативы. Обычно скоростью лучше жертвовать во имя поддержки и надёжности. У нас ведь задача не гонку выиграть, а груз со склада на склад довести. |
|
05.12.2017, 18:58 | #16 |
Гость
|
Цитата:
Сообщение от ax_mct
Если это ваши собственные эксперименты в песочнице то это одно,
но если это бизнес-требования то не могли бы вы ими поделиться. Возможно мы предложим достойные альтернативы. Обычно скоростью лучше жертвовать во имя поддержки и надёжности. У нас ведь задача не гонку выиграть, а груз со склада на склад довести. Есть сущность которую нужно выгружать, и есть ситуация когда эта сущность настолько велика, что ее формирование это десятки часов (система достаточно мощная). И задача была в том, что бы разбить выгрузку этой сущности на потоки что бы снизить общее время ее генерации так как есть записи которые выгружаются 10 секунд, а есть записи которые выгружаются 10 минут, и пришли к выводу что нужно разбить выгрузку на задачи (потоки). Каждый поток записывает резульатат в таблицу (единственный выход синхронизации потоков). Потом, когда все потоки отработали, идем в таблицу и создаем из записей json, который с помощью Custom Service можна забрать. Вот собственно и все |
|
05.12.2017, 20:46 | #17 |
Administrator
|
Ну нормальная такая задача. Есть таблица, которая заполняется неким алгоритмом расчета и эта таблица большая. Допустим, это проводки по номенклатуре. Если разбить алгоритм на потоки и приравнять 1 поток = 1 номенклатура, то выгрузка будет неравномерной (по какой-то номенклатуре движений больше, а по какой-то меньше).
Так вот - в этой задаче не вижу проблем поместить этот список потоков в отдельную таблицу. Количество потоков всяко будет на много порядков меньше количества записей в этой сущности. Зачем извращаться с List-ом?
__________________
Возможно сделать все. Вопрос времени |
|
05.12.2017, 23:16 | #18 |
Banned
|
Цитата:
Сообщение от Rardd
Извините за задержку с ответом. Задача в следующем:
Есть сущность которую нужно выгружать, и есть ситуация когда эта сущность настолько велика, что ее формирование это десятки часов (система достаточно мощная). И задача была в том, что бы разбить выгрузку этой сущности на потоки что бы снизить общее время ее генерации так как есть записи которые выгружаются 10 секунд, а есть записи которые выгружаются 10 минут, и пришли к выводу что нужно разбить выгрузку на задачи (потоки). Каждый поток записывает резульатат в таблицу (единственный выход синхронизации потоков). Потом, когда все потоки отработали, идем в таблицу и создаем из записей json, который с помощью Custom Service можна забрать. Вот собственно и все 2. В данном классе использовать Query c нужными вам data ranges (продукт, вендор, дата и пр.). 3. Позаботится об отсутствии конфликтов при вставке в конечную таблицу. 4. Поставить в пакетную обработку столько запусков сколько вам угодно разделяя обработку через значения в data ranges. Вполне вероятно что одновременный запуск вам на практике и не понадобится если исполнение будет ночным за несколько часов. По сути вы формируете некий data source для внешнего сервиса. Но я очень сомневаюсь обновления данных 1-3 раза в сутки в данном data source будет недостаточно. А если у вас полный runtime и каждый запрос внешнего сервиса создает новую выгрузку то пожалейте систему и себя. Все равно придете к периодическому формированию data source и его повторному использованию. И здесь надо то что называется "периодическая операция" в AX. На выделенном сервере, по расписанию, с параметрами и пр. Не нужна вам никакая синхронизация потоков. |
|
05.12.2017, 23:37 | #19 |
Боец
|
Цитата:
Сообщение от Rardd
Извините за задержку с ответом. Задача в следующем:
Есть сущность которую нужно выгружать, и есть ситуация когда эта сущность настолько велика, что ее формирование это десятки часов (система достаточно мощная). И задача была в том, что бы разбить выгрузку этой сущности на потоки что бы снизить общее время ее генерации так как есть записи которые выгружаются 10 секунд, а есть записи которые выгружаются 10 минут, и пришли к выводу что нужно разбить выгрузку на задачи (потоки). Каждый поток записывает резульатат в таблицу (единственный выход синхронизации потоков). Потом, когда все потоки отработали, идем в таблицу и создаем из записей json, который с помощью Custom Service можна забрать. Вот собственно и все Про Threads: у меня сложилось впечатление, что в силу неумения правильно готовить этот класс, просто советуют его не использовать. Его сложно отлаживать, нужно засинкать потоки, оптимизировать их количество, корректно вернуть результат из потока + вероятно вернуть infolog и т.д. Все это нетипичное для повседневных задач программирование, отсюда его не любят. Однако, работу он свою выполняет корректно, без мифических глюков и не раз выручал. В CIL он действительно не работает, но и не очень-то нужно. Threads больше подходит для интерактивных задач. Но для вашей задачи лучше использовать Batch это будет и проще и отказоустойчивое. |
|
|
За это сообщение автора поблагодарили: user_ax (2), Sergey Petrov (1). |
06.12.2017, 00:08 | #20 |
Banned
|
Цитата:
Кстати как вариант я бы еще рассматривал средства СУБД и хранимые процедуры. |
|
Теги |
async, ax2012, ax7, cil, d365 for operations, lock, thread |
|
Похожие темы | ||||
Тема | Ответов | |||
AX2012R3: полная синхронизация данных POS-магазина | 10 | |||
Синхронизация SP4 -> SP5 | 4 | |||
навязчивая синхронизация | 11 | |||
Репликация и синхронизация | 12 | |||
синхронизация с outlook | 7 |
|