- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 caf-0.15.7 中使用 system.registry() 通过调用 put(atom_value, actor ),我的进度不会自动终止,它会停止,直到我杀死它。
然而,当我明确添加 erase() 时,它将退出。
实际上正如 CAF 手册第 8 节所说:
Actors are removed automatically when they terminate.
这就是我想要的。所以我想知道这是否是错误。
要重现我的结果,请运行以下 C++ 代码:
#include <string>
#include <iostream>
#include "caf/all.hpp"
#include "caf/io/all.hpp"
using std::endl;
using std::string;
using namespace caf;
atom_value world_atom = atom("world_act");
atom_value hello_atom = atom("hello_act");
behavior world(event_based_actor *self) {
return behavior {
[=](const string &what) {
aout(self) << "Message: " << what << endl;
return std::string{"World"};
}
};
}
void hello(event_based_actor* self) {
string out_msg{"Hello "};
auto tmp = self->home_system().registry().get(world_atom);
auto buddy = actor_cast<actor>(tmp);
self->request(actor_cast<actor>(tmp), std::chrono::seconds(2), out_msg).then(
[=] (const string& what) {
aout(self) << "Message: " << what << endl;
});
}
int main() {
actor_system_config cfg;
actor_system system{cfg};
auto world_actor = system.spawn(world);
system.registry().put(world_atom, world_actor);
auto hello_actor = system.spawn(hello);
system.registry().put(hello_atom, hello_actor);
std::cout << "current running: " << system.registry().running() << endl;
/* Uncomment the following three lines if you want to stop automatically */
// getchar();
// system.registry().erase(hello_atom);
// system.registry().erase(world_atom);
return 0;
}
最佳答案
您的进程不会终止,因为 CAF 的参与者系统在关闭之前等待所有参与者。通常的 CAF 应用程序仅使用 main
来启动 actor。
Actors are removed automatically when they terminate.
这就是我想要的。
在您从示例中的注册表中删除参与者的那一刻,它们将变得无法访问并因此终止。一旦您的 Actor 全部终止, Actor 系统就会关闭。但是,您的代码片段永远不会显式终止 world
参与者,即它永远不会调用 self->quit()
。您可以通过 anon_send_exit(world_actor, exit_reason::user_shutdown)
强制执行。如手册中所述,终止它还会将其从注册表中删除。
关于c++ - 为什么 CAF system.registry() 应该在 put(atom_value) 之后自动调用 erase(atom_value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51542471/
我想在 caf-0.15.7 中使用 system.registry() 通过调用 put(atom_value, actor ),我的进度不会自动终止,它会停止,直到我杀死它。 然而,当我明确添加
我是一名优秀的程序员,十分优秀!