Фоновые задания в http-сервисах OneScript

28.03.18

Разработка - OneScript

В статье описана библиотека, реализующая механизм фоновых заданий в http-сервисах OneScript, а также некоторые обновления платформы 1.0.19

Скачать файлы

Наименование Файл Версия Размер
Библиотека, реализующая фоновые задания:
.zip 6,80Kb
4
.zip 6,80Kb 4 Скачать

 

Введение

При разработке приложений, периодически возникают задачи, требующие одновременного  выполнения нескольких процессов. В платформе 1С:Предприятие данная функциональность реализована при помощи механизма фоновых заданий. В стандартной поставке OneScript данная функциональность отсутствует, поэтому целью настоящей статьи является описание библиотеки, которая реализует механизм фоновых заданий в web-приложениях (http-сервисах) OneScript.

 

Описание

Библиотека реализует типы МенеджерФоновыхЗаданийWeb, СостояниеФоновогоЗадания и ФоновоеЗаданиеWeb, которым в платформе 1С:Предприятие соответствуют типы МенеджерФоновыхЗаданий и ФоновоеЗадание соответственно.

Реализованные типы

МенеджерФоновыхЗаданийWeb

Методы:

  • Выполнить
  • ОжидатьЗавершения
  • ПолучитьФоновыеЗадания

ФоновоеЗаданиеWeb

Свойства:

  • ИмяМетода
  • ИнформацияОбОшибке
  • Ключ
  • Конец
  • Наименование
  • Начало
  • РазделениеДанных
  • РегламентноеЗадание
  • Состояние
  • УникальныйИдентификатор

Методы:

  • ОжидатьЗавершения
  • Отменить
  • ПолучитьСообщенияПользователю

СостояниеФоновогоЗадания

Аналогичен соответствующему типу в 1С:Предприятие.

 

Отличия от платформы 1С:Предприятие

Библиотека практически полностью совместима с платформой 1С:Предприятие на уровне кода, однако все-же имеются незначительные отличия:

ФоновыеЗаданияWeb.ПолучитьФоновыеЗадания

В отличие от 1С:Предприятие, где фоновые задания хранятся в информационной базе и Вы можете получить примерно 1000 последних фоновых заданий, запущенных на выполнение, текущая реализация библиотеки имеет динамический список выполняемых заданий. Задания помещаются в список при вызове метода Выполнить и удаляются после завершения фонового задания. Таким образом, в отличие от 1С:Предприятие, метод возвращает фоновые задания, которые выполнялись на момент вызова метода или были завершены, но еще не удалены из списка.

ФоновоеЗаданиеWeb.РазделениеДанных

Всегда возвращает пустую структуру

ФоновоеЗаданиеWeb.РегламентноеЗадание

Ввиду отсутствия регламентных заданий, всегда возвращает Неопределено.

ФоновоеЗаданиеWeb.Отменить

Ввиду особенностей реализации, вызов этого метода не приводит к каким-либо действиям (задание продолжает выполнение и не отменяется).

ФоновоеЗаданиеWeb.ПолучитьСообщенияПользователю

Всегда возвращает пустой фиксированный массив.

 

Установка

Предварительные условия

Для использованиия настоящей библиотеки, необходимо установить обновление платформы OneScript, которое улучшает многопоточность http-сервисов OneScript.

Обновление для OneScript версии 1.0.19  можно скачать по нижеследующей ссылке: ASPNETHandler-v1.1-1.0.19.zip . Установка производится простым копированием содержимого архива, поверх файлов поставки OneScript.

Описание обновления, а также сопутствующих библиотек доступно по ссылке.

 

Установка библиотеки

Установка осуществляется копированием файлов dll в папку Bin веб-приложения. Затем, необходимо подключить библиотеку, добавив нижеследующую строку в секцию <appSettings>, файла web.config:

<add key="WebBackgroundJobs" value="attachAssembly" />

Настроить интервал проверки состояния фоновых заданий для метда ОжидатьЗавершения, можно добавив в раздел <appSettings>, файла web.config нижеследующий ключ:

<add key="jobsCheckInterval" value="5000" />

Интервал задается в миллисекундах. Интервал проверки по умолчанию (если ключ не установлен) составляет 1000 миллисекунд.

 

Использование

Ниже приведен фрагмент кода, иллюстрирующий работу библиотеки:

// Создаем объект менеджера фоновых заданий. Только для OneScript
//<OneScript>
ФоновыеЗадания = Новый МенеджерФоновыхЗаданийWeb;
//<!OneScript>

// Запускаем фоновые задания на выполнение
	
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(1);
МассивПараметров.Добавить("1.txt");
	
ФоновыеЗадания.Execute("Тестовый.ТестовоеФЗ", МассивПараметров, "Ключ1", "Описание1");
	
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(1);
МассивПараметров.Добавить("2.txt");
	
ФоновыеЗадания.Execute("Тестовый.ТестовоеФЗ", МассивПараметров);

// Получаем все выполняющиеся задания
МассивЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания();

// Ожидаем завершения выполнения запущеных заданий
ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);

// Продолжаем выполнение

 

Заключение

Надеюсь, что использование настоящей библиотеки, совместно с библиотеками обработки контента , работы с субд и кэширования данных, позволят вам создавать “взрослые” web-приложения на базе каркасной конфигурации, которые совместно с 1С:Предприятие, позволяют решать реальные бизнес-задачи ваших клиентов.

Web OneScript фоновые задания ФоновыеЗадания многопоточность

См. также

Особенности национального Workflow: Github Actions и OneScript

Групповая разработка (Git, хранилище) OneScript Бесплатно (free)

Сегодня мы посмотрим на Github Actions - встроенный инструментарий Github для автоматизации рабочих процессов. Разберем, что это такое, зачем и причем тут OneScript.

25.03.2024    1190    bayselonarrend    3    

37

TCP прокси-сервер хранилища конфигурации 1С

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) OneScript Платформа 1С v8.3 Бесплатно (free)

Продолжение истории с прокси хранилища, но уже не на HTTP, а на TCP и без падений по памяти веб-сервера. Проверяем комментарии хранилища, вызываем веб-хуки, старты пайплайнов, gitsync по событию помещения версии в хранилище. И все это полностью на знакомом и понятном OneScript.

17.01.2024    2775    kamisov    17    

57

Что такое ОСень? Или как лучшие практики из мира Java прижились в экосистеме OneScript

OneScript Бесплатно (free)

Думаете, на OneScript неудобно создавать сложные инфраструктурные приложения? Ошибаетесь. Благодаря фреймворку ОСень за последний год экосистема библиотек, упрощающих написание собственных приложений, существенно выросла. Расскажем о самых передовых технологиях OneScript. Спойлер: будет много рефлексии, мета-аннотаций, желудей, напильников и дубов с завязями.

21.11.2023    3115    NikitaIvanchenko    16    

46

Библиотека создания клиент-серверных приложений для сценарного языка OneScript

Инструментарий разработчика Работа с интерфейсом OneScript Россия Бесплатно (free)

Представленная библиотека позволяет создать многопоточный TCP сервер, к которому может одновременно подключиться множество TCP клиентов с удаленных компьютеров. Эти клиенты могут вызывать методы скриптов как на сервере, так и на других клиентах. Методы будут выполнены в контексте скрипта на удаленной машине. Возможна передача параметров в метод и получение результата. Для TCP клиента можно создать графический интерфейс с большим набором элементов управления, модальными диалоговыми окнами и с обработкой событий.

31.07.2023    2018    ahyahy    8    

32

Получаем статистику по git-репозиторию в разрезе разработчиков

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) OneScript Бесплатно (free)

Итак! Представим, что наступил момент, когда разработка через исходный код реализована на предприятии в полном объеме. Мы разрабатываем в EDT или конфигураторе (но выгружаем конфигурацию в исходный код), версионируем внешние отчеты и обработки и расширения, собираем релизы, проверяем код статическим анализом, в разработке царит гармония и мир. Красота! Но менеджерам этого мало, всегда хочется чего-то еще, и вот мне прилетает задача - дай статистику по вкладу в код каждого разработчика.

13.03.2023    3624    ardn    3    

27

Прокси хранилища 1С (IIS, OneScript)

Групповая разработка (Git, хранилище) OneScript DevOps и автоматизация разработки Платформа 1С v8.3 Россия Бесплатно (free)

Избавляемся от версионной зависимости, проверяем комментарии, вызываем веб-хуки, делаем красивые пути. И все это на привычном IIS и понятном OneScript.

08.12.2022    8037    kamisov    57    

95

OneScript на страже порядка на сервере тестовых баз данных

Администрирование СУБД OneScript Бесплатно (free)

Наводим порядок на сервере тестовых баз с помощью любимого инструмента - OneScript. Находим заброшенные базы на сервере MS SQL, определяем кандидатов на удаление.

14.06.2022    4255    ardn    23    

37

Идем в Serverless с кодом 1С

Облачные сервисы, хостинг OneScript Россия Абонемент ($m)

Запускаем код OneScript в Serverless Container Яндекса.

1 стартмани

29.04.2022    3698    1    papami    2    

9
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. starik-2005 3033 29.03.18 12:39 Сейчас в теме
А sleep в oneScript'е есть? А то без него управление многопоточными вычислениями мягко говоря ущербно...
2. blackhole321 1303 29.03.18 12:43 Сейчас в теме
(1)sleep есть, называется Приостановить. Честно говоря и без sleep ничего ущербного не вижу. Если не секрет -зачем создавать поток и стоить его?
Merkalov; +1 Ответить
3. blackhole321 1303 29.03.18 12:44 Сейчас в теме
4. starik-2005 3033 29.03.18 12:50 Сейчас в теме
(3) стопить не поток, а управляющую процедуру, чтобы не проверять мульон раз в секунду, завершился у меня расчет в потоке или нет. Т.е. так как-то:
  Пока ЕстьПотоки() Цикл
  Если ЕстьЗавершенныйПоток() Тогда
    Данные = ПолучитьСледующуюПорциюДанных();
    Если Данные = Неопределено Тогда
      Прервать;
    КонецЕсли;
    ДобавитьВСписокФЗ(
      ФоновыеЗадания.Выполнить("МодульФЗ.ОбработкаДанных", ПолучитьЗначениеВМссиве(Данные), ...)
      );
   КонецЕсли;
   Подождать 10мс;
  КонецЦикла;
  ДождатьсяЗавершенияВЗ();
Показать
sasha777666; +1 2 Ответить
5. blackhole321 1303 29.03.18 13:04 Сейчас в теме
(4) Понятно. Можно в самом потоке, при завершении инициировать новый поток, если остались данные для обработки.
6. starik-2005 3033 29.03.18 13:09 Сейчас в теме
(5)
если остались данные для обработки.
Тогда это не параллельность, а последовательное выполнение. Смысл теряется...
7. blackhole321 1303 29.03.18 13:14 Сейчас в теме
(6) Ну почему же, Вы можете сделать столько потоков, сколько элементов данных, подлежащих обработке (по крайней мере несколько, если у Вас некий пул), также, как Вы делаете в цикле, только в самих потоках.
8. starik-2005 3033 29.03.18 13:19 Сейчас в теме
(7) а микросекундный sleep есть?
9. blackhole321 1303 29.03.18 13:32 Сейчас в теме
(8)Думаю - нет, ведь и Linux и Windows не ОС реального времени, в Windows квант времени ~10-20 миллисекунд, поэтому даже если написать Sleep(1), то задержка будет > 1 мс.
10. blackhole321 1303 29.03.18 13:33 Сейчас в теме
(8) А если не секрет, зачем Вам такие малые задержки?
11. blackhole321 1303 29.03.18 13:55 Сейчас в теме
(8) Вот есть к примеру такая реализация микросекундного таймера https://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer , которую не сложно перенести, однако, как отмечает сам автор, если использовать в не real-time ОС, периодически интервалы будут неверными.
12. starik-2005 3033 29.03.18 14:23 Сейчас в теме
(11) периодические интервалы тут не особо критичны. Фактически если у Вас N заданиий, которые обрабатывают по M блоков, то массив из Х блоков они обработают за Х/M/N раз. При том если элемент данных обрабатывается за разное время, то некоторые блоки должны будут обработаться раньше, чем другие, и ДождатьяЗавершения будет ждать самый долгообрабатываемый блок. Для того, чтобы загрузить новые процессы данными, нужно их стартануть с новым массивом обрабатываемой информации. Если ждать секунду (как в 1С, когда народ юзает "ping localhost"), то за секунду можно некоторое количество элементов уже обработать. Поэтому хорошо бы ждать 1/10-ю секунды, например. И на сколько это в миллисекундах точно - второй вопрос, главное чтобы в это время процессор просто ждал...
13. blackhole321 1303 29.03.18 15:19 Сейчас в теме
(12)
Если ждать секунду (как в 1С, когда народ юзает "ping localhost"), то за секунду можно некоторое количество

Ну 1/10 секунды - это 100 миллисекунд, что вполне нормально и для Sleep, который уже есть. И это будет действительно приостановка выполнения. Вот описание метода, который реализует Sleep в OneScript https://msdn.microsoft.com/ru-ru/library/system.threading.thread.sleep(v=vs.110).aspx

Моя изначальная мысль была в том, что можно запускать потоки для обработки новых порций данных из самих потоков, примерно так:

Процедура МоеФЗ(ДанныеДляОбработки) Экспорт
	
	// Что-то делаем
	
	Отбор = Новый Структура;
	Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно);
	Отбор.Вставить("ИмяМетода", "МойМодуль.МоеФЗ");
	МассивЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
	
	МаксКоличествоПотоков = 5;
	КоличествоПотоков = МаксКоличествоПотоков - МассивЗаданий.Количество() + 1;
	
	Для Индекс = 1 По КоличествоПотоков Цикл
		
		ДанныеДляОбработки = ПолучитьСледующуюПорциюДанных();
		
		Если ДанныеДляОбработки = Неопределено Тогда
			Возврат;
		КонецЕсли;
		
		МасиивПараметров = Новый Массив;
		МассивПараметров.Добавить(ДанныеДляОбработки);
		ФоновыеЗадания.Выполнить("МойМодуль.МоеФЗ", МассивПараметров);
		
	КонецЦикла;
	
КонецПроцедуры
Показать
16. пользователь 15.05.18 05:50
Сообщение было скрыто модератором.
...
17. пользователь 17.05.18 05:54
Сообщение было скрыто модератором.
...
14. пользователь 29.03.18 19:47
Сообщение было скрыто модератором.
...
15. пользователь 03.04.18 12:30
Сообщение было скрыто модератором.
...
Оставьте свое сообщение