OberonCore
https://forum.oberoncore.ru/

Coroutines вместо потоков
https://forum.oberoncore.ru/viewtopic.php?f=31&t=5219
Страница 3 из 3

Автор:  Info21 [ Суббота, 08 Апрель, 2017 13:55 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Дмитрий Дагаев писал(а):
За один цикл таймера Actions можно вызвать один цикл вычислений, как в ObxActions, а можно несколько. Планировщик SchedTasks вызывает фоновую задачу снова и снова, пока есть время до следующего цикла. У меня разница в 400000 раз.
Правильно я понимаю, что это что-то вроде специального фонового Action'а, который добавляет опций управления очередью Экшенов сверх тех, что есть в ББ?

Автор:  Дмитрий Дагаев [ Воскресенье, 09 Апрель, 2017 11:23 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Подробнее про ObxActions против Co_ObxActions.
Изначальный пример ObxActions в BlackBox вызывает за один цикл Services.Action (период около 50 миллисекунд) процедуру
Код:
   PROCEDURE Step (VAR cur, divisor: INTEGER; f: TextMappers.Formatter);
      VAR end, sqrtCur: INTEGER;
   BEGIN
      end := divisor + stepSize;
      sqrtCur := SHORT(ENTIER(Math.Sqrt(cur)));
      WHILE (divisor <= sqrtCur) & (divisor < end) & (cur MOD divisor # 0) DO divisor := divisor + 2 END;
      IF divisor > sqrtCur THEN   (* cur is a prime *)
         f.WriteInt(cur); f.WriteLn;
         divisor := 3; cur := cur + 2
      ELSIF divisor < end THEN   (* cur is not a prime, test next one *)
         divisor := 3; cur := cur + 2
      ELSE   (* time exhausted, continue test next time *)
      END
   END Step;

После одной итерации расчетов происходит выход из процедуры, чем завершается содержательная часть (a: PrimeAction) Do.

Пример с Co_ObxActions вызывается планировщиком Co_SchedTasks.
Код:
   PROCEDURE Do (t: Ct.Task) ;
      VAR a: PrimeAction; end, sqrtCur, n: INTEGER;
   BEGIN
      a := t(PrimeAction);
      FOR n := 0 TO a.attempts-1 DO
         a.current := 3; a.divisor := 3;
         REPEAT
            end := a.divisor + stepSize;
            sqrtCur := SHORT(ENTIER(Math.Sqrt(a.current)));
            WHILE (a.divisor <= sqrtCur) & (a.divisor < end) & (a.current MOD a.divisor # 0) DO
               a.divisor := a.divisor + 2
            END;
            IF a.divisor > sqrtCur THEN   (* cur is a prime *)
               IF n = 0 THEN
                  a.f.WriteInt(a.current); a.f.WriteLn
               END;
               a.divisor := 3; a.current := a.current + 2
            ELSIF a.divisor < end THEN   (* cur is not a prime, test next one *)
               a.divisor := 3; a.current := a.current + 2
            END
         UNTIL a.current > a.to;
         Co.Yield
      END;
      Co.Stop
   END Do;

Здесь после каждой итерации вызывается Co.Yield, после чего управление передается планировщику. Планировщик смотрит, есть ли время до следующего цикла. По умолчанию (load_pct - может быть изменено) фоновым задачам отводится до 40% процессорного времени. Если есть время 40% от времени цикла - шаг планировщика повторяется и вновь вызывается задача Do.

Что выяснилось? За время 9 сек на моем компьютере пример ObxActions выполняется 1 раз (Upper Bound= 256), а Co_ObxActions выполняется 400000 раз (Upper Bound= 256, N Attempts= 400000). Значит, фоновая задача в ObxActions использует имеющееся время неэффективно.

Иван Денисов писал(а):
А что тогда происходит во время срабатывания следующего цикла? Возврат в главную сопрограмму?

Каждый цикл Action вызывает планировщик Co_SchedTasks
Код:
   PROCEDURE (a: Action) Do ();
   BEGIN
      IF a.s.enabled THEN
         a.s.Step(a.s); Services.DoLater(a, a.s.p.interval)
      END
   END Do;

А Step планировщика передает управление сопрограммам и получает управление назад, когда те делают Co.Yield.

Info писал(а):
Правильно я понимаю, что это что-то вроде специального фонового Action'а, который добавляет опций управления очередью Экшенов сверх тех, что есть в ББ?

Один Action, на нем висит планировщик, он управляет очередью сопрограмм.

Автор:  Info21 [ Воскресенье, 09 Апрель, 2017 17:17 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Спасибо, попытаюсь понять.

Автор:  Дмитрий Дагаев [ Воскресенье, 09 Апрель, 2017 18:19 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Если совсем простым языком, 2 варианта работы в фоновом режиме.
1. ObxActions - Вы пришли ночью накопать червей для утренней рыбалки. Много не накопаете - коробочку, и можно уходить.
2. Co_ObxActions - Вы работаете ночью под руководством "Планировщика" на сборе овощей, которому передаете ящик овощей за ящиком, пока он не скажет: Все, рабочий день окончен.
Во втором случае наработаете больше (только про физическую работу).

Автор:  Info21 [ Воскресенье, 09 Апрель, 2017 22:33 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Фу, червяки )) Даже уклейку ловлю активно, ультралайтом ))

Автор:  Artyemov [ Понедельник, 10 Апрель, 2017 11:01 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Info21 писал(а):
Фу, червяки )) Даже уклейку ловлю активно, ультралайтом ))

Динамит (: "Пять карасей и два водолаза"

Автор:  Иван Денисов [ Понедельник, 10 Апрель, 2017 14:28 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Поглядите, пожалуйста, вот такую организацию встроенной поддержки сопрограмм:
http://blackboxframework.org/unstable/i ... a1.843.zip

Это пока без обсуждения странной версии планировщика Йозефа.

Автор:  Иван Денисов [ Понедельник, 10 Апрель, 2017 14:43 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

На самом деле странно, что вы сравниваете тогда их. Вроде как Actions и не задуманы как непрерывные задачи... это просто отложенные действия и они не должны как-то эффективно использовать фоновое время. Предполагается, что все это время занимает основная программа Блэкбокса. Поэтому получается некая подозрительная спекуляция при сравнении.

Но в целом вещь крайне полезная. Начинаю въезжать потихоньку. Раньше приходилось в интенсивные вычисления самому вставлять обработку сообщений, чтобы GUI не зависал.
Код:
   PROCEDURE ProcessMessages;
      VAR msg: Win.MSG; res: INTEGER;
   BEGIN
      WHILE Win.PeekMessage(msg, 0, 0, 0, Win.PM_REMOVE) # 0 DO
         res := Win.TranslateMessage(msg); res := Win.DispatchMessageA(msg)
   END END ProcessMessages;

Кажется это Александр Ильин когда-то предложил, если не ошибаюсь.

Либо надо было еще ставить Services.actionHook.Step; в цикл своих долгих вычислений, чтобы остальные события отложенные тоже выполнялись.

Это была такая творческая ручная балансировка. А так получается, что возможно все автоматизировать.

Автор:  Дмитрий Дагаев [ Понедельник, 10 Апрель, 2017 23:08 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Иван Денисов писал(а):
На самом деле странно, что вы сравниваете тогда их. Вроде как Actions и не задуманы как непрерывные задачи... это просто отложенные действия и они не должны как-то эффективно использовать фоновое время. Предполагается, что все это время занимает основная программа Блэкбокса. Поэтому получается некая подозрительная спекуляция при сравнении.

Заметьте, не я это предложил
Overview by Example: ObxActions писал(а):
This example demonstrates how background tasks can be implemented using actions. An action is an object which performs some action later when the system is idle, i.e., between user interactions. An action can be scheduled to execute as soon as possible, or after some time has passed. Upon execution, an action may re-schedule itself for a later point in time. In this way, an action can operate as a background task, getting computation time whenever the system is idle. This strategy is called cooperative multitasking.

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

Автор:  Дмитрий Дагаев [ Вторник, 11 Апрель, 2017 09:33 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Иван Денисов писал(а):
Поглядите, пожалуйста, вот такую организацию встроенной поддержки сопрограмм:
http://blackboxframework.org/unstable/i ... a1.843.zip

Это пока без обсуждения странной версии планировщика Йозефа.


Примерно да. У меня была версия под 1.6, недоделанная, которую я направлял Йозефу. Если интересно, пришлите email-адрес в личку, направлю.
Йозеф настаивает на своем, даже пропатчил Co_ своими вызовами. Интерфейсно нормально, но развивать проще, когда стеки отдельно, а Host Coroutines отдельно.

Автор:  Илья Ермаков [ Понедельник, 19 Июнь, 2017 20:32 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

В сборку OberonCore вошёл вариант изменений в ядро из нашей платформы приложений.

viewtopic.php?f=116&t=6070

Итого, третий вариант? Ппц. )

Автор:  Дмитрий Дагаев [ Воскресенье, 01 Октябрь, 2017 17:36 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Доклад на дне Оберона "Сопрограммы и кооперативная многозадачность" https://forum.oberoncore.ru/viewtopic.php?f=127&t=6091&p=101972#p101972
Видео доклада https://www.youtube.com/watch?v=oo2ZhZHSDNg&list=PLoKr-_Vv5yq7Hdxq1edBtyxvkTehP4t09&index=2

Автор:  Дмитрий Дагаев [ Воскресенье, 01 Октябрь, 2017 18:22 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Последняя версия Co_ для BlackBox обновлена у H.Zinn http://www.zinnamturm.eu/downloadsAC.htm#Co_
Внимание!
Если вы ставите ее с BB 1.7.1, т.е. модифицированным J.Templ ядром, то ставьте без изменений.
Если вы ставите ее с BB ранее, чем 1.7.1, то перед компиляцией скопируйте Routines6.odc в Routines.odc.

Автор:  prospero78 [ Среда, 04 Октябрь, 2017 13:51 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Да, смотрел доклад. Согласен, что лезть в ядро -- очень сомнительное занятие.
Чем оно меньше, тем лучше во всех смыслах. Завтра кто-то пожелает перетащить ББ под Андроид, а там "всё не так". Опять ядро кромсать?

Автор:  arlean1 [ Суббота, 10 Февраль, 2018 21:34 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Дмитрий Дагаев писал(а):
... Кстати, для развлечения там есть:
- Задача обедающих философов, ...

Спасибо!!!
эта задача вряд ли для развлечений, скорее тестовый эталон.

Если кто-то не сталкивался, то можно почитать в книге "Взаимодействующие последовательные процессы" Х.Хоар Мир 1989 год стр. 69
Книга доступна в Интернете для скачивания.
Ещё интересный пример на эту тему в Главе 6 Планирование ресурсов - Алгоритм поликлиники.

Страница 3 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/