Имя: Пароль:
1C
1С v8
как запустить несколько фоновых заданий паралельно?
0 vde69
 
26.05.15
15:24
база файловая...

делаю так:

    Для Каждого эл из МассивДиапазонов Цикл
        // для каждого потока создаем строчку
        
        НоваяСтрока = Потоки.Добавить();
        НоваяСтрока.АдресСтарт = эл.АдресСтарт;
        НоваяСтрока.АдресКонец = эл.АдресКонец;
        НоваяСтрока.РазмерДиапазона = ПоддержкаIP.ПолучитьРазмерДиапазонаАдресовIP(эл.АдресСтарт, эл.АдресКонец, Истина);
        ПраметрыЗадания = Новый Структура;
        ПраметрыЗадания.Вставить("АдресСтарт", эл.АдресСтарт);
        ПраметрыЗадания.Вставить("АдресКонец", эл.АдресКонец);                                    
        
        мРезультатЗапуска = ДлительныеОперации.ЗапуститьВыполнениеВФоне( ,"ФоновыеОбработки.НайтиАктивныеIP", ПраметрыЗадания);
        
        НоваяСтрока.ИдентификаторЗадания = мРезультатЗапуска.ИдентификаторЗадания;
        НоваяСтрока.АдресХранилища = мРезультатЗапуска.АдресХранилища;



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

Так все вроде работает, но нужна многопоточность.
1 ДенисЧ
 
26.05.15
15:28
А если  не использовать всякие левые ДлительныеОперации, а взять штатный метод МенеджерФоновыхзаданий.Выполнить() ?
2 Heckfy
 
26.05.15
15:29
3 ЧеловекДуши
 
26.05.15
15:38
(0) Зачем? Все ровно по порядку поступления "В очередь, в очередь, с..кины дети!!11" (Шариков) :)
4 Волшебник
 
модератор
26.05.15
15:40
(0) Нужна серверная база
5 ДенисЧ
 
26.05.15
15:41
(4) Поздравляют с присвоением очередного воинского звания!
6 Волшебник
 
модератор
26.05.15
15:42
(5) Асинхронность - зло. Если в фоновом задании будет бесконечная рекурсия, то она обрушивает серверный процесс со всеми толстыми клиентами.
7 Heckfy
 
26.05.15
15:51
(6) Остановка через тысяча секунд не спасет?
9 tridog
 
26.05.15
15:54
(0) В файловой базе одновременно только одно фоновое задание.

В серверной приведенный тобой в (0) код будет работать так, как ожидаешь.

И да, сетевой сканер на 1С - вы знаете толк в сексуальных извращениях)
10 Бубка Гоп
 
26.05.15
15:58
(9) Видимо это продолжение
как найти все компьютеры в сети?
11 Бубка Гоп
 
26.05.15
15:59
(10) + интересно взглянуть на процедуу ФоновыеОбработки.НайтиАктивныеIP
12 Asmody
 
26.05.15
16:00
(6) Ой вэй! Вселенная вообще весьма асинхронная штука
13 vde69
 
26.05.15
16:03
(9)
блин протестить не могу,
сервера и нету, писал на 8.3.6, а рабочий сервак 8.3.5

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

Вообще хотел написать оптимизатор, но уже немного ушел в сторону :)
14 vde69
 
26.05.15
16:04
(11) пожалуйста :)

Процедура НайтиАктивныеIP(Параметры, АдресХранилища) Экспорт
    Перем дн1, дн2, дн3, дн4;
    Перем дк1, дк2, дк3, дк4;    
    Перем АдресСтарт, АдресКонец;
    
    Результат = Новый Структура;    
    НайденыеIP = Новый Массив;
    
    Отказ = Ложь;
    Если    Параметры.Свойство("АдресСтарт", АдресСтарт) = Ложь
        ИЛИ Параметры.Свойство("АдресКонец", АдресКонец) = Ложь Тогда
        
        Отказ = Истина;
        Результат.Вставить("Ошибка", "Отсутствуют параметры диапазона поиска");
    КонецЕсли;
    
    Попытка
        Локатор = Новый COMОбъект("WbemScripting.SWbemLocator");
        ConnectionLocal = Локатор.ConnectServer();
    Исключение
        Отказ = Истина;
        Результат.Вставить("Ошибка", ОписаниеОшибки());
    КонецПопытки;
    
    Если не Отказ Тогда
        ПоддержкаIP.РазбитьАдресIP(АдресСтарт, дн1, дн2, дн3, дн4, Истина);
        ПоддержкаIP.РазбитьАдресIP(АдресКонец, дк1, дк2, дк3, дк4, Истина);
        Всего = 0;
        Для е1 = дн1 по дк1 Цикл  
            Для е2 = дн2 по дк2 Цикл  
                Для е3 = дн3 по дк3 Цикл  
                    Для е4 = дн4 по дк4 Цикл  
                          Всего = Всего + 1;
                        мТекущийАдрес = ПоддержкаIP.ПолучитьIP(е1, е2, е3, е4);
                        Пинги = ConnectionLocal.ExecQuery("Select * From Win32_PingStatus where Address = '" + мТекущийАдрес + "'");
                        Для Каждого Пинг из Пинги Цикл
                               Если Пинг.StatusCode = 0            // все нормально
                              или Пинг.StatusCode = 11010 Тогда //Превышен Интервал Ожидания Для Запроса
                                НайденыеIP.Добавить(мТекущийАдрес);
                            КонецЕсли;
                        КонецЦикла;
                          ДлительныеОперации.СообщитьПрогресс(Всего, мТекущийАдрес);
                    КонецЦикла;
                КонецЦикла;
            КонецЦикла;
        КонецЦикла;
        Результат.Вставить("НайденыеIP", НайденыеIP);
        Результат.Вставить("Результат", Истина);
    Иначе
        Результат.Вставить("Результат", Ложь);
    КонецЕсли;
    
    ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
    
КонецПроцедуры
15 Fragster
 
гуру
26.05.15
16:07
16 Fragster
 
гуру
26.05.15
16:08
17 vde69
 
26.05.15
16:13
(16) знаю, но у меня немного другая идея многопоточного тестирования. Не буду вдаваться в подробности, если результат будет, распишу, если нет - то и флудить нечего :)
18 Бубка Гоп
 
26.05.15
16:30
(14) любопытно, благодарю. Почитаю что за зверь такой этот WbemScripting
19 Гёдза
 
26.05.15
16:35
Может пора уже на нормальные языки переходить?
20 Бубка Гоп
 
26.05.15
16:43
(19) полетел камень в огород одинэснегов.
нормальные => более подходящие для этих целей?
21 vde69
 
26.05.15
16:48
(19) когда надо переходить - я перехожу, здесь точно не надо, ибо мне СУБД нужно...
22 Бубка Гоп
 
26.05.15
16:50
(21) а можно ли запрос из (14) переделать так:
"Select * From Win32_PingStatus where Address WITHIN '" +  СписокАдресов + "'"
23 Волшебник
 
модератор
26.05.15
16:51
(7) Там нет никакой тысячи секунд. Вываливается с дампом.
24 vde69
 
26.05.15
16:54
25 fisher
 
26.05.15
17:10
(0) На файловой - вроде никак. Документировано, что последовательно.
26 Serginio1
 
26.05.15
17:19
(6) В нормальных средах можно запускать задачи учитывая, что задача будет долгой, широкослойной операцией, включая большие, чем детализированные компоненты системы.  Предоставляет сведения для TaskScheduler, что следует ожидать избыточной подписки. Превышение лимита подписки позволяет создать больше потоков, чем количество доступных аппаратных потоков.

https://msdn.microsoft.com/ru-ru/library/system.threading.tasks.taskcreationoptions(v=vs.110).aspx

public Task(
    Action action,
    TaskCreationOptions creationOptions
)
27 vi0
 
26.05.15
17:53
1с где-то публиковала опыт оптимизации закрытия взаиморасчетов в БП паралельными фоновыми заданиями
28 Serginio1
 
26.05.15
18:06
29 vi0
 
27.05.15
12:05
30 МихаилМ
 
27.05.15
13:53
два ФЗ должны работать параллельно в  файловой  1с 8.3.5

http://v8.1c.ru/o7/201305fi/index.htm

в 8.3.6.2014 в описании оптимизаций заявлено ускорение запуска 1 фз.
31 Fragster
 
гуру
27.05.15
14:56
(30) не два, а одно. типа клиент и фоновое - параллельно (до 8.3.3 клиент на время обработки замораживался)