Имя: Пароль:
1C
1С v8
Многопоточный парсер на 1С
, ,
0 adelaide
 
24.09.13
16:10
Добрый день пишу обработку для парсинга сайта, не получается реализовать многопоточность, нашел одну статью на ифостарте, но не совсем понял код приведенный там.
Рассмотрим процедуру проверки списка прокси-серверов (ее тоже хочу сделать многопоточной):

1) Есть:
ТЗ тзПрокси - состоит из колонок: "Сервер", "Порт", "Использовать"
ПроверитьПрокси() - возвращает истина если прокси рабочий и анонимный

Необходимо в несколько потоков запусить процедуру проверки прокси по тзПрокси и заполнить результатами колонку "Использовать", подскажите как сие реализовать?
1 adelaide
 
24.09.13
16:15
ЧислоПараллельныхПотоков = 10;
МассивЗаданий = Новый Массив;

Для каждого Стр из тзПрокси Цикл

        МассивПараметров = Новый Массив;
        МассивПараметров.Добавить(Стр.Сервер);
        МассивПараметров.Добавить(Стр.Порт);
        МассивПараметров.Добавить(Стр.Использовать);

Задание = ФоновыеЗадания.Выполнить("Многопоточность.ПроверитьПрокси", МассивПараметров);

        МассивЗаданий.Добавить(Задание);

        Если МассивЗаданий.Количество() >= ЧислоПараллельныхПотоков Тогда
            Попытка
                ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);
            Исключение
            КонецПопытки;
            МассивЗаданий.Очистить();
        КонецЕсли;

    КонецЦикла;

    Если МассивЗаданий.Количество() > 0 Тогда
        Попытка
            ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);
        Исключение
        КонецПопытки;
        МассивЗаданий.Очистить();
    КонецЕсли;

КонецПроцедуры
2 Maxus43
 
24.09.13
16:16
создаёшь пул фоновых заданий, в каждом проверяешь конкретный прокси.
Проблема с получением результата выполнения фоновых, погугли, описано в статьях
3 adelaide
 
24.09.13
16:16
(1) вот примерно так должно быть если делать по статье... вопрос, как из фонового задания получить результат и собственно пометить его в тзПрокси?
4 Maxus43
 
24.09.13
16:18
5 adelaide
 
24.09.13
16:21
(4) спасибо, хм, а со времен 8.1 ничего не поменялось? толко писать в базу/вызывать исключение?
6 Maxus43
 
24.09.13
16:22
(5) в 8.2 не поменялось епним, а в 8.3 незнаю
7 adelaide
 
24.09.13
16:28
(6) Нашел способ для 8.2 через ПоместитьВоВременноеХранилище, хотя по сути те же костыли, но можно добавить в книгу знаний:
http://danila.org.ua/parallelnaya-zagruzka-zagruzitbyis/
8 Maxus43
 
24.09.13
16:38
(7) да те же йайца, только сбоку
9 adelaide
 
24.09.13
17:58
(8) благодарю, вроде бы все получилось...
Еще бы теперь понять сколько будет кушать ресурсов каждый поток и определить их оптимальное число...
10 adelaide
 
24.09.13
18:14
Еще вопрос, как задать время жизни рег. заданию, чтоб оно убивалось если не успело отработать за этот промежуток времени?

ИЗ СП так и не понял этом коде задания грохнутся через 20 сек или нет??:
ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий, 20);
11 adelaide
 
24.09.13
18:17
что-то у меня висят фоновые задания и не удаляются даже через консоль кластера :(.
12 romix
 
24.09.13
18:18
Внешние процессы можно запускать.
А по приходу файла-результата его ловить и считывать.
13 Fragster
 
модератор
24.09.13
18:19
смирись
14 adelaide
 
24.09.13
18:21
(13) с чем?
(12) я над этим вариантом параллельно работаю, там как свои плюсы (меньше памяти кушает, быстрей отрабатывает..) так и свои минусы есть...
15 Serginio1
 
24.09.13
18:27
А не проще использовать любые языки поддерживающие многопоточность и написать СОМ сервер?
16 adelaide
 
24.09.13
18:29
(15) смотри (14)
17 Serginio1
 
24.09.13
18:30
(14) А в чем минусы?
18 Serginio1
 
24.09.13
18:34
Если тебе нужно запустить несколько потоков а потом дождаться выполнения и выдать результат то достаточно и обычного СОМ. Если нужно возвращать результат из отличного от потока приложения, тогда нужна ВК. Которая просто делается например http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=2019

Исходник ВК которая загружает Объект Автоматизации поддерживающий ITypeInfo и выполняет все его свойства и методы через IlanguageExtender.
19 adelaide
 
24.09.13
18:37
(18) COM не больше ресурсов будет жрать чем рег. задачи?
20 mistеr
 
24.09.13
18:46
(17) Надо что-то учить, кроме 1С
21 Serginio1
 
24.09.13
18:46
Рег задачи выполняются на сервере. Да и парсинг на 1С не сильно быстрая операция. На компилируемом языке все можно решить намного проще и быстрее. Хоть на том же C#.
А почему СОМ должен жрать больше?
22 adelaide
 
24.09.13
18:49
(17) переносимость решения например
23 adelaide
 
24.09.13
18:53
(11)

Добавил на форму обработчик ожидания который проверяет сколько времени выполняется фоновая задача и если больше указанного интервала то убивает фоновую задачу, правда уже запущенные задания не завершаются :( ни программно ни через консоль сервера, в чем может быть проблема?
24 Fragster
 
модератор
24.09.13
18:55
(23) прежде, чем продолжить эксперименты, рестартани сервер 1с
25 adelaide
 
24.09.13
18:56
(24) еще нельзя =)
26 Serginio1
 
24.09.13
18:56
А чем проблема переносимости?
27 adelaide
 
24.09.13
19:00
(26) ну написал я парсер на php, работает он то быстрей, 600 потоков и памяти не много жрет, но серверная часть должна на хостинге стоять + определенные параметры сервера нужны как то cURL, ну и реализовывать обмен между скриптом на php и 1С надо + еще реализовывать оповещение о ходе выполнения парсинга.
28 Serginio1
 
24.09.13
19:13
(27) Вот 600 потоков как раз и жрут ресурсы. Обычно используют пул потоков в 2 раза больше чем ядер, а то и по количеству ядер.
Про опвещение как в (1) Ты наример на C# можешь запустить потоки, дождаться их выполнения и возвратить результат. Если нужны ассинхронные сообщения то ВК
29 adelaide
 
24.09.13
20:23
(28) ну в данном случае на потоки разбивается процесс получения страниц через прокси, и в парсере на пхп для запуска 600 потоков с головой хватает 200 Мб оперативной памяти и одного проца, в 1С не знаю как замерить, но думаю что надо намного больше ресурсов, но пусть даже в 30-100 потоков хочу попробовать.
C# у меня на уровне лабораторок университетских, но надо будет попробовать разобраться, думаю что использовать ВК удобней чем веб-сервис на пхп.
30 Fragster
 
модератор
24.09.13
20:37
31 Fragster
 
модератор
24.09.13
20:38
еще буквально вчера появился http://www.gilev.ru/testg1c/ , сильно давит на диск