Единственная проблему я здесь вижу, если подобные фреймворки не поддерживают poll, а оба реализованы через строго блокирующий event loop. Но и эту часть можно обойти с помощью физической многопоточности (в плане реактора только, всю остальную часть реализуем на продолжениях).
В принципе, ты прав -- в чистой среде сопрограммы можно попробовать заменить обычными тредами. Но здесь уже возникают вопросы производительности. Например, на десяти тысячах потоках машина гарантировано встанет раком, а сопрограмм может быть хоть миллион.
Ну, как обычно такие фреймворки делаются? Мы предоставляем ему коллбэк (возможно, не один - ну дык у нас на то ADT имеются), а он его время от времени дёргает: function callback(request) { ... // create a suitable responce somehow return responce; } function main() { ... exitCode = runFramework(callback); ... // job is done }(язык, само собой, абстрактный, C-подобный).
Допустим теперь, что в языке есть континуэйшены. Пишем: var kOut, kIn; function callback(request) { return callCC k { kIn = k; kOut(Left(request)); } } function initFramework() { return callCC k { kOut = k; exitCode = runFramework(callback); return Right(exitCode); } } function stepFramework(responce) { return callCC k { kOut = k; kIn(responce); } } function main() { ... result = initFramework(); while(true) { switch(result) { case Left(request): ... // create a suitable responce somehow result = stepFramework(responce); case Right(exitCode): ... // job is done } } }И шо
( ... )
Континуэйшенов должно хватить.
Reply
Все правильно, я про это писал статью в ПФП :)
Reply
Reply
Reply
Reply
Reply
Единственная проблему я здесь вижу, если подобные фреймворки не поддерживают poll, а оба реализованы через строго блокирующий event loop. Но и эту часть можно обойти с помощью физической многопоточности (в плане реактора только, всю остальную часть реализуем на продолжениях).
В принципе, ты прав -- в чистой среде сопрограммы можно попробовать заменить обычными тредами. Но здесь уже возникают вопросы производительности. Например, на десяти тысячах потоках машина гарантировано встанет раком, а сопрограмм может быть хоть миллион.
Reply
А вот это ответ и он, что удивительно, совпадает с моим мнением.
Reply
Народ вполне запускает миллионы потоков без проблем с производительностью.
Reply
function callback(request) {
... // create a suitable responce somehow
return responce;
}
function main() {
...
exitCode = runFramework(callback);
... // job is done
}(язык, само собой, абстрактный, C-подобный).
Допустим теперь, что в языке есть континуэйшены. Пишем:
var kOut, kIn;
function callback(request) {
return callCC k {
kIn = k;
kOut(Left(request));
}
}
function initFramework() {
return callCC k {
kOut = k;
exitCode = runFramework(callback);
return Right(exitCode);
}
}
function stepFramework(responce) {
return callCC k {
kOut = k;
kIn(responce);
}
}
function main() {
...
result = initFramework();
while(true) {
switch(result) {
case Left(request):
... // create a suitable responce somehow
result = stepFramework(responce);
case Right(exitCode):
... // job is done
}
}
}И шо ( ... )
Reply
Так будет лучше.
Reply
Reply
Reply
Вообще-то, там ещё две переменные, если тебе зрение callCC застил.
Reply
Запись и чтение переменных - эффект, в IO наличествующий, а потому его можно и не учитывать.
Reply
Leave a comment