LINUX.ORG.RU

Язык или framework с time constraint-ами.


0

1

Бывает ли язык или фреймворк, который позволяет оперировать ограничениями времени выполнения функций или методов? Например помечаю как либо кусок кода, что он должен исполниться за 3 секунды, он или выполняется или бросает исключение. В идеале, еще следит за ресурсами (файлы, сокеты открытые в этом блоке закрывает).

Если кто знает такое поделитесь ссылками.

★★★
Ответ на: комментарий от KRoN73

Понятно, что делается. Как сделать, я прекрасно понимаю. Но не имею желания изображать гения и городить велосипед.

Ответ про PHP из серии «внезапно». Не ожидал. И наверное предрочел бы другой язык, но все равно спасибо.

Svoloch ★★★
() автор топика
Ответ на: комментарий от dave

Про ADA в гугле упоминание в одной книжке и не очень внятное. Не понятно как делали и что можно.

Svoloch ★★★
() автор топика

http://www.erlang.org/doc/man/timer.html

The following coding example illustrates a process which performs a certain action and if this action is not completed within a certain limit, then the process is killed.

Pid = spawn(mod, fun, [foo, bar]),
%% If pid is not finished in 10 seconds, kill him
{ok, R} = timer:kill_after(timer:seconds(10), Pid),
...
%% We change our mind...
timer:cancel(R),
...
quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

А это нормально в эрланге килять поток? Просто в большинстве языков при этом Undefined behaviour. Но у эрланга же свои потоки.

Svoloch ★★★
() автор топика

В JUnit есть ограничение по времени исполнения тестов. Можно поглядеть, как это у них реализовано.

Zloddey
()
Ответ на: комментарий от Svoloch

А это нормально в эрланге килять поток?

Это (лёгкий) процесс - нормально, там в основном всё строится на том, что процессы можно создавать сотнями тысяч. Сам процесс это функция выполняемая асинхронно, сами функции могут отправлять / принимать сообщения другим / от других процессов (тоже асинхронно запущенных функций). Вообще, акторы (лёгкие процессы и асинхронные сообщения) + актор timer [+ soft real-time] это возможное общее решение такой задачи.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Основы Эрланга я знаю.

А вот специфику: Что будет если процесс занят тяжелой задачей? Он умрет когда закончит или раньше? Если есть открытые дескрипторы, что с ними будет?

Svoloch ★★★
() автор топика
Ответ на: комментарий от Zloddey

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

Svoloch ★★★
() автор топика
Ответ на: комментарий от Svoloch

[code] exit_after/3

Send an exit signal with reason Reason1 to Pid Pid. Returns {ok, TRef}, or {error, Reason2}. exit_after/2

Same as exit_after(Time, self(), Reason1). kill_after/2

Same as exit_after(Time, Pid, kill). kill_after/1

Same as exit_after(Time, self(), kill). [/code]

пока до receive не дойдёт не умрёт.

nanoolinux ★★★★
()
Ответ на: комментарий от nanoolinux
exit_after/3

   Send an exit signal with reason Reason1 to Pid Pid. Returns {ok, TRef}, or {error, Reason2}.

exit_after/2

   Same as exit_after(Time, self(), Reason1).

kill_after/2

   Same as exit_after(Time, Pid, kill).

kill_after/1

   Same as exit_after(Time, self(), kill). 

пока до receive не дойдёт не умрёт.

nanoolinux ★★★★
()
Ответ на: комментарий от dave

ЕМНИП, в Ada 2005 есть возможность устанавливать дедлайны задачам.

buddhist ★★★★★
()
Ответ на: комментарий от Svoloch

Кое-какая информация есть в «Rationale for Ada 2005: 4 Tasking and Real-Time», только имей в виду, что компиляторы Ады обычно дорогие :)

dave ★★★★★
()
Ответ на: комментарий от dave

Да... Ада красава. Еще бы были компиляторы доступные...

Svoloch ★★★
() автор топика
Ответ на: комментарий от Svoloch

Не скажу точно про GNAT, но скорее всего, что да. Правда, я с ним только игрался. Тут на ЛОРе есть люди, которые много дольше меня использовали его.

Кстати, вот по-видимому ответ:

task Worker is 
  pragma Relative_Deadline (Milliseconds (20));
  ..
end Worker;
dave ★★★★★
()
Ответ на: комментарий от dave

Я понимаю. Проверить возможности нет сейчас.

Svoloch ★★★
() автор топика
Ответ на: комментарий от Svoloch

Что будет если процесс занят тяжелой задачей? Он умрет когда закончит или раньше? Если есть открытые дескрипторы, что с ними будет?

Ну как в эрланге это делают - на уровне мелочей это receive/after и try/of/catch/after, в масштабе приложения - то как общаются процессы, например, master/worker:

-module(test).
-compile(export_all).
-import(timer).

master(Wait, Timeout) ->
    process_flag(trap_exit, true),
    io:format("master: take resources~n"),
    Worker = spawn_link(?MODULE, worker, [self()]),
    Worker ! {work, Wait},
    timer:exit_after(timer:seconds(Timeout), Worker, timeout),
    receive
        done ->
            io:format("master: done~n"),
            io:format("master: free resources~n"),
            exit(done);
        {'EXIT', _, timeout} ->
            io:format("master: timeout~n"),
            io:format("master: free resources~n"),
            exit(timeout)
    end.

worker(Master) ->
    receive
        {work, Wait} ->
            io:format("worker: do the hard work~n"),
            timer:sleep(timer:seconds(Wait)),
            io:format("worker: send result to master~n"),
            Master ! done,
            io:format("worker: done~n")
    end.
$ erl
Erlang R13B03 (erts-5.7.4) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> c(test).
{ok,test}
2> timer:tc(test, master, [1, 2]).
master: take resources
worker: do the hard work
worker: send result to master
worker: done
master: done
master: free resources
{1001501,{'EXIT',done}}
3> timer:tc(test, master, [10, 2]).
master: take resources
worker: do the hard work
master: timeout
master: free resources
{2001087,{'EXIT',timeout}}
4> 
quasimoto ★★★★
()

Для питона:

with Timeout(3):
   <your stuff>
true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.