Используя Erlang, как я должен распределить загрузку среди кластера?

@echo on
@setlocal
@set "prompt=--$G "

set "CREATE_OR_DELETE=CREATE"
for %%A in (:test1 :test2) do call %%A
goto :eof


:test1
rem *** Test 1 ***

if %CREATE_OR_DELETE%==DELETE goto :label
set "var=1"
if %var%==%CREATE_OR_DELETE% echo OK
set "var="
:label
goto :eof


:test2
rem *** Test 2 ***

if %CREATE_OR_DELETE%==DELETE (
    set "var=1"
    if %var%==%CREATE_OR_DELETE% echo OK
    set "var="
)
goto :eof

Этот пример может показать вашу распознанную проблему.

Метка :test1 использует идею goto :label, чтобы избежать кода между ( и ), который анализируется сразу. Преимущество заключается в том, что каждая команда анализируется отдельно, поэтому вы можете легче обнаружить ошибку. Это также может избежать проблем с переменным расширением, когда может потребоваться включение отложенного расширения.

Метка :test2 использует код между ( и ). Это вызывает ошибку при разборе, поскольку %var% не определено из-за того, что отложенное расширение не включено. Описание ошибки может быть бессмысленным в зависимости от используемого кода.

Подводя итог, можно сказать, что наличие большого количества команд между ( и ) может быть эффективным, хотя и может затрудняться отладкой.


Вот ваш код с некоторыми изменениями, которые могут помочь.

@echo off

net session 1>nul 2>nul || goto :eof

:begin
set "CREATE_OR_DELETE=CREATE"
set "TASKNAME=TASK"
set "SCHEDULE=ONSTART"
set "TASKRUN=cmd.exe"
set ALLARGS=%*

if not defined ALLARGS (
    goto getinfo
) else (
    goto parsetags
)

:getinfo
choice /c CD /n /m "Are you (c)reating or (d)eleting?"
:: "obsolete as already set" if errorlevel 1 set CREATE_OR_DELETE=CREATE
if errorlevel 2 set "CREATE_OR_DELETE=DELETE"
cls

set /p "TASKNAME=What is the name of the task you're creating/deleting :: "
cls

if "%CREATE_OR_DELETE%" == "DELETE" goto :skip_create
::the code crashes on the above if statement
::that is why I'm dumbfounded

:skip_create
  • Двойная кавычка многих команд набора.
  • ALLARGS проверено, если определено, а не обрабатывает %* напрямую, что может быть рискованно.
  • Убрана метка :eof, так как ее не нужно вставлять. goto знает, что это представляет конец файла.
  • errorlevel 1 проверить после того, как choice прокомментировано, поскольку оно уже назначено.
  • goto :skip_create добавлено, чтобы избежать создания кода между ( и ).
  • [Тысяча сто тридцать одна]
6
задан ryeguy 19 March 2009 в 13:08
поделиться

3 ответа

Я не знаю, существует ли это модули, реализованные уже, но что я могу сказать, баланс загрузки переоценен. То, что я могу обсудить, случайное размещение заданий является лучшим выбором, если Вы не знаете намного большей информации, как загрузка произойдет в будущее, и в большинстве случаев Вы действительно не делает. Что Вы записали:

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

Как Вы знаете, что все они наименее загруженный узел не будут самыми высокими загруженный только в следующем мс? То, как Вы знаете, что все те высокие загруженные узлы, которые Вы не будете включать в список разве, отбрасывают, не загрузится только в следующем мс? Вы действительно не можете знать это, если у Вас нет очень редкого случая.

Просто мера (или вычисляют) производительность Вашего узла и установила вероятность узла быть выбранной, зависят его. Выберите узел случайным образом независимо от текущей загрузки. Используйте это в качестве начального подхода. При установке его затем можно попробовать, составляют некоторый более сложный алгоритм. Я держал пари, что это будет очень тяжелая работа для избиения этого начального подхода. Доверяйте мне, очень трудно.

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

6
ответ дан 17 December 2019 в 00:14
поделиться

Цель дерева контроля состоит в том, чтобы справиться, процессы не обязательно передают запросы. Нет никакой причины, Вы не могли использовать другой код для отправления запросов непосредственно членам списка доступных процессов. Посмотрите pool:get_nodes или pool:get_node () функции для одного способа получить те списки.

Можно позволить модулю пула обработать управление процессами (перезапуск, контроль и уничтожение обработки) и использовать некоторый другой модуль для прозрачного перенаправления запросов к пулу процессов. Возможно, Вы искали распределенные пулы хотя? Будет трудно убежать от основного процесса в erlang, не идя в распределенные узлы. Целая рабочая система является в значительной степени одним большим деревом контроля.

1
ответ дан 17 December 2019 в 00:14
поделиться

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

0
ответ дан 17 December 2019 в 00:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: