Скажем, в моем облаке есть 18 ядер, и каждое ядро может выполнять 2 потока, что означает, что в целом я могу продолжить 36 потоков. Предположим, я создал 36 потоков. Я хочу создать 36 ARInvoices через график ARInvoiceEntry. Что лучше/быстрее: разделите ARINvoiceEntry график среди 36 потоков или создайте 36 графиков ARInvoiceEntry.Acumatica с потоками
ответ
Наконец-то я нашел способ правильно ускорить вставку в Acumatica. Самая большая часть, о которой нужно помнить, заключается в том, что постоянство базы данных должно выполняться в одном потоке. Этого легко добиться при блокировке C#. Вот некоторые фрагменты моего рабочего раствора: блокировки объекта:
private Object thisLock = new Object();
Для каждого логического ядра я создал нить и разделения данных для каждого потока отдельно:
int numberOfLogicalCores = Environment.ProcessorCount;
List<Thread> threads = new List<Thread>(numberOfLogicalCores);
int sizeOfOneChunk = (customers.Count/numberOfLogicalCores) + 1;
for (int i = 0; i < numberOfLogicalCores; i++)
{
int a = i;
var thr = new Thread(
() =>
{
var portions = customers.Skip(a * sizeOfOneChunk).Take(sizeOfOneChunk).ToList();
InsertCustomersFromList(portionsCustomers);
}
);
thr.Name = $"thr{i}";
threads.Add(thr);
}
foreach (var thread in threads)
{
thread.Start();
}
foreach (var thread in threads)
{
thread.Join();
}
, а затем часть, которая должна выполняться в одном потоке Я заблокировал его следующим образом:
lock (thisLock)
{
custMaint.Actions.PressSave(); // custMaint is the name of created graph
}
В моих тестах улучшение разницы в повышении было три раза. 110 записей были вставлены через 1 минуту по сравнению с тремя минутами в однопоточном режиме. А также ресурсы сервера использовались с большей эффективностью.
Экземпляр графа создается каждый раз, когда клиент отправляет данные на сервер и уничтожается после обработки запроса. Представления данных извлекают верхнюю запись данных на основе Order by. Поэтому для обработки вам нужно будет убедиться, что нужная запись извлекается в вашем представлении. Моим выбором было бы создать 36 графиков. Не стесняйтесь возражать ... это интересный вопрос.
в каждом потоке, чтобы создать график ARInvoiceEntry отдельно или создать для каждого потока, отделенного графиком ARInvoiceEntry? В чем разница между этими двумя? извините, непонятно для меня. – Hybridzz