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

12 Comments

  1. starik-2005

    А sleep в oneScript’е есть? А то без него управление многопоточными вычислениями мягко говоря ущербно…

    Reply
  2. blackhole321

    (1)sleep есть, называется Приостановить. Честно говоря и без sleep ничего ущербного не вижу. Если не секрет -зачем создавать поток и стоить его?

    Reply
  3. blackhole321

    (2)стоить -> стопить

    Reply
  4. blackhole321

    (4) Понятно. Можно в самом потоке, при завершении инициировать новый поток, если остались данные для обработки.

    Reply
  5. starik-2005

    (5)

    если остались данные для обработки.

    Тогда это не параллельность, а последовательное выполнение. Смысл теряется…

    Reply
  6. blackhole321

    (6) Ну почему же, Вы можете сделать столько потоков, сколько элементов данных, подлежащих обработке (по крайней мере несколько, если у Вас некий пул), также, как Вы делаете в цикле, только в самих потоках.

    Reply
  7. starik-2005

    (7) а микросекундный sleep есть?

    Reply
  8. blackhole321

    (8)Думаю — нет, ведь и Linux и Windows не ОС реального времени, в Windows квант времени ~10-20 миллисекунд, поэтому даже если написать Sleep(1), то задержка будет > 1 мс.

    Reply
  9. blackhole321

    (8) А если не секрет, зачем Вам такие малые задержки?

    Reply
  10. blackhole321

    (8) Вот есть к примеру такая реализация микросекундного таймера https://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer , которую не сложно перенести, однако, как отмечает сам автор, если использовать в не real-time ОС, периодически интервалы будут неверными.

    Reply
  11. starik-2005

    (11) периодические интервалы тут не особо критичны. Фактически если у Вас N заданиий, которые обрабатывают по M блоков, то массив из Х блоков они обработают за Х/M/N раз. При том если элемент данных обрабатывается за разное время, то некоторые блоки должны будут обработаться раньше, чем другие, и ДождатьяЗавершения будет ждать самый долгообрабатываемый блок. Для того, чтобы загрузить новые процессы данными, нужно их стартануть с новым массивом обрабатываемой информации. Если ждать секунду (как в 1С, когда народ юзает «ping localhost»), то за секунду можно некоторое количество элементов уже обработать. Поэтому хорошо бы ждать 1/10-ю секунды, например. И на сколько это в миллисекундах точно — второй вопрос, главное чтобы в это время процессор просто ждал…

    Reply
  12. blackhole321

    (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 По КоличествоПотоков Цикл
    
    ДанныеДляОбработки = ПолучитьСледующуюПорциюДанных();
    
    Если ДанныеДляОбработки = Неопределено Тогда
    Возврат;
    КонецЕсли;
    
    МасиивПараметров = Новый Массив;
    МассивПараметров.Добавить(ДанныеДляОбработки);
    ФоновыеЗадания.Выполнить(«МойМодуль.МоеФЗ», МассивПараметров);
    
    КонецЦикла;
    
    КонецПроцедуры
    

    Показать

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *