|   |   | 
| 
 | Многопоточный парсер на 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 | 
        (29) есть http://infostart.ru/public/173394/     | |||
| 31
    
        Fragster модератор 24.09.13✎ 20:38 | 
        еще буквально вчера появился http://www.gilev.ru/testg1c/ , сильно давит на диск     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |