powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как делать кучу параллельных IO-Bound операций ?
7 сообщений из 57, страница 3 из 3
Как делать кучу параллельных IO-Bound операций ?
    #39690503
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore
не смотрел код Task.WhenAll, но если там что-то типа
Код: c#
1.
2.
foreach (var element in enumerable)
  await element;




Там такая мутота
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	List<Task> list = new List<Task>();
	foreach (Task task2 in tasks)
	{
		if (task2 == null)
		{
			throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_NullTask"), "tasks");
		}
		list.Add(task2);
	}
	return Task.InternalWhenAll(list.ToArray());
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39690515
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, по хорошему, нужна система с обратной связью, т. е. на каждой итерации увеличиваешь количество потоков/тасков, до тез пор, пока растет итоговая производительность и не увеличиваешь/понижаешь когда итоговая производительность начинает падать.
await/async тут тебе не нужно.
Ну и как правило нужно улучшить производительность БД, созданием индексов/статистик/мат. view и протиранием монитора.
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39690524
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВawait/async тут тебе не нужно

При наличии I/O весьма полезен.

Систему с обратной связью покажи )
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39690526
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВ,

Интересно. Какой прок тогда принимать IEnumerable, если все сводится к ToArray.
Наверное ради того, чтобы собрать результат работы всех тасков, чтобы потом выбросить AggregateException. Но даже в этом случае не лучше ли было работать с List в который динамически добавлять каждую задачу после ее ожидания.

Ну. Не нам судить профи, скорее всего причина все таки у них есть, просто нужно изучать код. Причина скорее всего есть, я верю в профессионализм разрабов C#.

В любом случае, как я сказал выше, на достаточно небольшом числе задач, указанный метод вполне рабочий. Буду его пока придерживаться.
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39690546
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Систему с обратной связью покажи )
Как то так.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Concurrent;
using System.Diagnostics;
using Profiling;
using System.IO;

namespace Leo.Loader.Service
{
    public class RmqThreadManagerConsumer2<T> where T : class
    {
        static object Locker = new object();
        Func<Tuple<T[], string, Action>> _getter;
        Action<T> _runner;
        ConcurrentQueue<double> concurrentQueue = new ConcurrentQueue<double>();
        System.Timers.Timer timer2;
        volatile int Counter;
        Logics.FileWriter inputFileWriter;// = new Logics.FileWriter(System.Configuration.ConfigurationManager.AppSettings[])
        Logics.FileWriter errorFileWriter;
        public RmqThreadManagerConsumer2(Func<Tuple<T[], string, Action>> getter, Action<T> runner, string queueName, string inputRoot, string errorRoot)
        {
            _getter = getter ?? throw new ArgumentNullException(nameof(getter));
            _runner = runner ?? throw new ArgumentNullException(nameof(runner));
            if (string.IsNullOrEmpty(queueName))
                throw new ArgumentNullException(nameof(queueName));
            inputFileWriter = new Logics.FileWriter(inputRoot);
            errorFileWriter = new Logics.FileWriter(errorRoot);
            timer2 = new System.Timers.Timer(1000);
            timer2.SynchronizingObject = new SynchronizeInvoke();
            timer2.Elapsed += (o, a) => 
            {
                Run();
            };
            timer2.Start();
        }

        void Run()
        {
            lock (Locker)
            {
                Measure();
            }
        }
        void Grow(double d)
        {
            var agg = concurrentQueue.Count < 1 ? 1 : concurrentQueue.Count;
            var summ = concurrentQueue.Sum();
            var avg = summ / agg;
            Console.WriteLine("avg-" + avg);
            if ((1.1*d) > avg)//время выросло
            {
                if (Counter > 2)
                    Counter--;
            }
            else//время уменьшилось
            {
                if (Counter < 100)
                    Counter++;
            }
            concurrentQueue.Enqueue(d);
            if (agg > 100)
            {
                concurrentQueue.TryDequeue(out double x);
            }
        }
        void Measure()
        {
            Tuple<T[], string, Action> t = null;
            try
            {
                var c = Counter;

                while (c-- >= 0)
                {
                    Stopwatch sv = new Stopwatch();
                    bool IsNull = false;
                    t = _getter();
                    var res = Task.Factory.StartNew(() =>
                    {
                        sv.Start();
                        
                        if (t?.Item1 == null)
                        {
                            IsNull = true;
                            return;
                        }
                        foreach (var x in t.Item1)
                        {
                            _runner(x);
                        }
                        if (!string.IsNullOrEmpty(t.Item2))
                        {
                            lock (inputFileWriter)
                            {
                                inputFileWriter.Write(DateTime.Now, t.Item2, Path.GetRandomFileName() + ".json");
                            }
                        }
                    }).ContinueWith(task =>
                    {
                        var exc = task.Exception;
                        sv.Stop();
                        if (!IsNull)
                            Grow(sv.ElapsedMilliseconds);
                    });
                    var sdf = res.Exception;
                    if (sdf != null)
                    {
                        Logger.Instance.Error(sdf);
                        continue;
                    }
                    //помечаем сообщение обработанным
                    t?.Item3?.Invoke();
                    //res.Wait();
                }
            }
            catch (Exception exc)
            {
                Logger.Instance.Error(exc, "Ошибка в Measure");
                lock (errorFileWriter)
                {
                    errorFileWriter.Write(DateTime.Now, t?.Item2, Path.GetRandomFileName() + ".json");
                }
            }
        }
    }
}
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39690880
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

спасибо, потестирую в ближайшее время :)
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39690890
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕвгенийВ,

спасибо, потестирую в ближайшее время :)
Хорошо. Это только идея и первая реализация в лоб.
...
Рейтинг: 0 / 0
7 сообщений из 57, страница 3 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как делать кучу параллельных IO-Bound операций ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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