Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Фоновые задания #764

Closed
khorevaa opened this issue Jun 6, 2018 · 46 comments
Closed

Фоновые задания #764

khorevaa opened this issue Jun 6, 2018 · 46 comments
Milestone

Comments

@khorevaa
Copy link
Contributor

khorevaa commented Jun 6, 2018

Хочется функционала фоновых заданий в движке.

Запуск по определенному ключу или процедуре в коде.

п.с. возможно просто добавление многопоточности - в каком то виде

@artbear
Copy link
Collaborator

artbear commented Jun 6, 2018

возможно просто добавление многопоточности

смешно, да :) просто и многопоточность рядом не употребляется :)

@dmpas
Copy link
Collaborator

dmpas commented Jun 6, 2018

просто и многопоточность рядом не употребляется :)

@artbear вполне себе употребляются, пока не появляются "разделяемые ресурсы" - вот тогда "просто" улетает в мусор.

@khorevaa
Copy link
Contributor Author

khorevaa commented Jun 6, 2018

Ну в golang просто вызываешь go и далее имя метода с параметрами )) Предлагаю у нас сделать os и далее имя метода с параметрами ))

@dmpas
Copy link
Collaborator

dmpas commented Jun 6, 2018

@khorevaa вопрос, повторюсь, в разделении ресурсов. Синтаксис-то можно выдумать, концепции нет

@khorevaa
Copy link
Contributor Author

khorevaa commented Jun 6, 2018

@dmpas Я тебя не понимать.. что за разделение ресурсов ... Кого делим и как...

@dmpas
Copy link
Collaborator

dmpas commented Jun 6, 2018

@khorevaa вот ты чего хочешь фоново распараллелить?

@nixel2007
Copy link
Collaborator

@khorevaa ты же фоновое задание хочешь с какими-то параметрами запустить? и это явно не строка, а например, массив? таблица значений? классы настроенные какие-нибудь?..

@khorevaa
Copy link
Contributor Author

khorevaa commented Jun 6, 2018

@dmpas Я хочу распараллелить синхронизацию с хранилищем по нескольким репозиторием..
сейчас это возможно сделать запуская разные процессы. Т.к. дописать чтонить типа "ПотокКоманд" в 1commands, который будет уметь ВыполнитьПараллельно(5)
А хочется просто запускать часть кода в отдельном потоке без генерации отдельного приложения

@nixel2007 Да захочу )) Ну можно это все копировать в процесс - как дубликаты....

@ghost
Copy link

ghost commented Jun 6, 2018

@khorevaa то есть ты хочешь отказаться от jenkins ?

Что касается фоновых заданий - то они тут https://github.com/EvilBeaver/OneScript.Web/blob/develop/examples/backgroundjobs/src/model/modules/%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B8%D0%A4%D0%BE%D0%BD%D0%BE%D0%B2%D1%8B%D1%85.os

@khorevaa
Copy link
Contributor Author

khorevaa commented Jun 7, 2018

@allustin я не могу отказаться от того чего у меня нет. Но вообще смысл чутка другой... а именно многопоточное выполнение приложения и сервер сборок тут не причем

@arkuznetsov
Copy link
Contributor

@allustin @dmpas Мне вот на ум приходит задача асинхронного запуска приложений, т.е. не ждать пока приложение выполнится, а подвесить "Новый ОписаниеОповещения("МойМетод")" и там уже анализировать вывод команды.
Не совсем фоновые задания, но параллельности добавляет.
Ну и в принципе, для будущих применений можно развить тему асинхронного вызова любых методов с обработкой результатов.

@dmpas
Copy link
Collaborator

dmpas commented Jun 7, 2018

@arkuznetsov через ОписаниеОповещения мне нравится, развивай мысль.

@arkuznetsov
Copy link
Contributor

arkuznetsov commented Jun 7, 2018

@dmpas
Приблизительно так:

// Основной код
МойОбработчик = Новый МойКлассОбработчик();

МойОбъект = Новый МойКласс();

ПараметрыОбработки = Новый Массив();

ОписаниеОповещения = Новый ОписаниеОповещения("МойМетодОбработки", МойОбработчик, ПараметрыОбработки);

Параметры = Новый Массив();

ВыполнитьАсинхронно(МойОбъект, "МойМетод", Параметры);
// МойКласс.os

Функция МойМетод()
	Возврат "Это мой метод";
КонецФункции
// МойКлассобработчик.os

Процедура МойМетодОбработки(ВозвращаемоеЗначение, ДополнительныеПараметры)
	Сообщить(ВозвращаемоеЗначение);
КонецПроцедуры

Дальше можно пофантазировать на тему свойства ассинхронности для экземпляра класса в целом. Там еще можно найти применение для аннотаций.

@artbear
Copy link
Collaborator

artbear commented Jun 7, 2018

Пожалуйста, только не нужно ОписаниеОповещения

не нужен нам этот 1С-ский ад :(

@dmpas
Copy link
Collaborator

dmpas commented Jun 7, 2018

@artbear твои варианты? Ад от 1С хорош хотя бы тем, что уже придуман. А так, я тоже не в восторге

@nixel2007
Copy link
Collaborator

nixel2007 commented Jun 7, 2018 via email

@dmpas
Copy link
Collaborator

dmpas commented Jun 7, 2018

да бог с ним с синтаксисом

@nixel2007 тут замкнутый круг: чтобы взяться за евент луп и остальную хрень, нужна цель. Чтобы появилась цель, нужен синтаксис. Нафига пилить синтаксис, если вопрос не в нём и надо делать евент-луп.

Так что будет синтаксис - будет евент-луп. Не будет синтаксиса - не будет ничего

@arkuznetsov
Copy link
Contributor

@artbear @dmpas Я исключительно с претензией на +/- совместимость с 1С.

@EvilBeaver
Copy link
Owner

Хаспада, почитайте сообщение Никиты про event-loop.

Вопрос фоновых в оскрипте очень простой - кто будет управлять временем жизни фоновых потоков, когда стартовый поток подошел к концу?

Перем ЧтобыБылоВеселее;

Процедура МетодФонового()
     Для Сч = 1 По 10 Цикл
         ЧтобыБылоВеселее = ЧтобыБылоВеселее + 1;
         Приостановить(Сч * 2000);
     КонецЦикла;
КонецПроцедуры

Сообщить("Я начало стартового скрипта");
ЧтобыБылоВеселее = 0;
ФоновыеЗадания.Выполнить("МетодФонового");
ФоновыеЗадания.Выполнить("МетодФонового");
Сообщить("Я конец стартового скрипта");

Вопрос - что должно происходить после выполнения строки Сообщить("Я конец стартового скрипта");?

@arkuznetsov
Copy link
Contributor

@EvilBeaver Служба/демон :-) Ну или счетчик запущенных дочерних "потоков" и завершать, только когда счетчик обнулится (видимо еще какое-то TTL должно быть для принудительной остановки). Фоновые я не совсем могу придумать для чего использовать, а вот про асинхронные вызовы я выше написал.

@khorevaa
Copy link
Contributor Author

khorevaa commented Jun 7, 2018

@EvilBeaver Механизм сокетов.

@dmpas
Copy link
Collaborator

dmpas commented Jun 7, 2018

@arkuznetsov @khorevaa надо ответить на прямой вопрос:

что должно происходить

варианты навскидку:

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

@khorevaa
Copy link
Contributor Author

khorevaa commented Jun 7, 2018

@dmpas

  1. Процесс должен прекращаться
  2. Процесс должен ждать ФоновыеЗадания.ОжидатьЗавершения() - тут просто ждать...
  3. Процесс должен ждать ФоновыеЗадания.ОжидатьЗавершения(КлючПроцесса) - тут просто ждать... завершения процесса
  4. Получение результатама выполнения ФоновыеЗадания.ПолучитьРезультатВыполнения(КлючФоновогоЗадания)
  5. Ошибки выполнения фоновога задания писать в отдельный объект с возможностью получения.

У меня так получилось

@arkuznetsov
Copy link
Contributor

@khorevaa А вот отладка со всем этим будет еще веселее чем в типовых 1С. :-)

@arkuznetsov
Copy link
Contributor

@dmpas

Основной процесс должен ждать пока не истечет TTL, потом гасить дочерние.
Вариант с отдельными процессами для асинхронных вызовов думаю не подойдет, т.к. нужен общий контекст выполнения.

@khorevaa
Copy link
Contributor Author

khorevaa commented Jun 7, 2018

@arkuznetsov кому надо отладит. Все развивается в усложнение...

@EvilBeaver
Copy link
Owner

Ок, идея с TTL, в принципе, мне нравится. А теперь вопрос с разделяемыми ресурсами. Меня бы устроил вариант, как в 1С - когда фоновое изолировано и параметры в него передаются сериализацией (глубокой копией). Но в случае с односкриптом, боюсь, этого будет мало. Глобальные ресурсы все равно существуют, в том числе и в подключенных пакетах.

@arkuznetsov
Copy link
Contributor

arkuznetsov commented Jun 8, 2018

@EvilBeaver Ты про то, что всем потокам будет доступно все, что есть в контексте скрипта и попытки менять одни и те же объекты/переменные?

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

@dmpas
Copy link
Collaborator

dmpas commented Jun 8, 2018

что было явно задано.

@arkuznetsov подключенные библиотеки - они явно заданы? Их модули с глобальными переменными?

@arkuznetsov
Copy link
Contributor

arkuznetsov commented Jun 8, 2018

@dmpas Да, тут источник "феерических" глюков, а их нельзя как-нить сделать read-only для дочерних потоков? Ну или изолировать контексты (что, как мне кажется, существенно сложнее).

@dmpas
Copy link
Collaborator

dmpas commented Jun 8, 2018

как-нить сделать read-only для дочерних потоков

вот так точно не стоит делать. Иначе, во-первых, смотря в код ни фига не понятно, как он отработает (хоть вводи &НаКлиенте да &НаСервере !), во-вторых, дочерние потоки таким образом по большому счёту лишаются возможности использовать библиотеки. Или библиотеки делать с расчётом на то, что будет выполняться в разном контексте. - Везде сплошные затыки.

@arkuznetsov
Copy link
Contributor

@dmpas Это я с точки зрения упростить задачу, а не решать сразу в общем виде.
Я правильно понимаю, что проблема только в глобальных переменных, или есть еще что-то подобное?

@dmpas
Copy link
Collaborator

dmpas commented Jun 8, 2018

проблема только в глобальных переменных

@arkuznetsov собственно, любое разделяемое состояние в любом его виде. Это может быть глобальная переменная, это может быть ссылка на какой-то объект, с которым работают сразу в двух потока.

@arkuznetsov
Copy link
Contributor

это может быть ссылка на какой-то объект, с которым работают сразу в двух

@dmpas С этим как раз поможет глубокое копирование. Или ты против такого подхода?

Или ты про объекты, на которые ссылаются глобальные переменные?

@dmpas
Copy link
Collaborator

dmpas commented Jun 8, 2018

@arkuznetsov да, на объекты могут ссылаться глобальные переменные или какой-нибудь шарповый код в движке или компонентах

@arkuznetsov
Copy link
Contributor

@dmpas А полностью контексты изолировать возможно?

@dmpas
Copy link
Collaborator

dmpas commented Jun 8, 2018

@arkuznetsov да, но это равносильно запуску отдельного процесса.

@arkuznetsov
Copy link
Contributor

arkuznetsov commented Jun 8, 2018

@dmpas А с отдельным процессом можно callback организовать в родительский процесс?

Может тогда так и надо делать? Т.е. условно "ВыполнитьАссинхронно()" из моего примера выше, будет создавать отдельный процесс и копировать контекст.

@dmpas
Copy link
Collaborator

dmpas commented Jun 8, 2018

@arkuznetsov ну, сейчас у процесса можно работать с потоком ввода и вывода. То есть, при желании, обратки можно сделать - и всё это без доработок движка, по идее.

@arkuznetsov
Copy link
Contributor

можно сделать - и всё это без доработок движка

@dmpas А вот тут можно какой-нить пример небольшой?
На тему, из основного скрипта запускаем отдельный процесс с другим скриптом, основной скрипт продолжает выполнение, по окончании "дочерний" скрипт вызывает метод основного и передает результаты.
Или мы что-то другое обсуждаем?

@dmpas
Copy link
Collaborator

dmpas commented Jun 9, 2018

@arkuznetsov ну, не совсем в таком виде. Сейчас можно сделать так:
основной скрипт запускает дочерний процесс, передав ему данные во входящий поток, дочерний процесс прочитал данные, обработал их, выдал результат в выходной поток. Основной процесс в это время делает своё дело, потом смотрит, что вернул дочерний процесс.

@arkuznetsov
Copy link
Contributor

arkuznetsov commented Jun 9, 2018

Основной процесс в это время делает своё дело, потом смотрит, что вернул дочерний процесс

@dmpas А вот про этот момент поподробнее. Когда смотрит? Где смотрит?
Есть пример где-то?

@dmpas
Copy link
Collaborator

dmpas commented Jun 9, 2018

Когда смотрит? Где смотрит?

в коде, в явном виде (то есть, да, без оповещения из-вне), в момент, когда нужен результат.

@tsukanov-as
Copy link

tsukanov-as commented Jul 25, 2018

В повершеле есть фоновые задания. Мне кажется запуская на них отдельные процессы ванскрипт получится то же самое по сути что в 1С

ps Хотя руки еще не дошли попробовать
pss Вот иметь ванскрипт в повершеле как донет-объект было бы просто феерически удобно

@EvilBeaver EvilBeaver modified the milestones: 1.3.0, 1.4.0 Feb 17, 2020
@artbear
Copy link
Collaborator

artbear commented Mar 17, 2021

Андрей сделал первичную реализацию 1cc24e6

@artbear
Copy link
Collaborator

artbear commented Mar 17, 2021

и в artbear/1commands#48 есть прототип для фоновых команд

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants