我需要根据需要生成同一个 gen_fsm 的几个独立实例,然后能够将调用路由到正确的实例。
Gproc库似乎是使用任意名称注册进程的好方法。它有一个函数gproc:reg_or_locate/3用于在没有竞争条件的情况下按需生成东西。这样我什至不需要主管 - 如果他们崩溃,他们将再次按需生成。但我不知道如何申请gproc:reg_or_locate/3生成 gen_fsm 或 gen_server。
到目前为止我尝试过的:
我只是通过该函数调用 gen_server:start() ,它将创建一个中间进程,为中间进程命名,中间进程将产生一个 gen_server 并终止,最后我得到一个无名的 gen_server。
gen_server 和 gen_fsm 都导出一个enter_loop函数,如果我将它提供给gproc:reg_or_locate/3,它似乎可以满足我的需要,但文档内容如下:
该进程必须已使用 proc_lib 中的启动函数之一启动,请参阅proc_lib(3)。
并且文档gproc:reg_or_locate/3没有提到他们通过 proc_lib 做任何事情。
或者,我可以让中间进程获取名称,然后以原子方式将其传输到它生成的 gen_server 或 gen_fsm,但这会造成竞争条件:中间进程将具有 gen_fsm 的名称,并且任何用于 gen_fsm 的消息都将转到中间进程过程并迷路。
我觉得我在这里错过了一些简单的东西。这不是一种罕见的模式,所以应该有一个很好的方法来做到这一点。我错过了什么?
erlang multithreading erlang-otp multiprocessing race-condition
我有一个可以像这样启动的 Erlang 启动脚本:
/usr/bin/erl -boot /path/to/my-boot-script
Run Code Online (Sandbox Code Playgroud)
从控制台运行时它可以工作,但是当我从 systemd 运行它时失败,没有任何错误消息。systemd 单元文件如下所示:
[Unit]
Description=My daemon written in Erlang
[Service]
Type=simple
ExecStart=/usr/bin/erl -boot /path/to/my-boot-script
Restart=always
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
日志显示系统正常启动,然后突然终止,没有任何错误消息。这到底是怎么回事?
Glib 2.30 API允许通过GThreadPriority枚举设置线程优先级。然而,该 API从 2.32 开始已被弃用,我找不到任何有关使用新 API 设置线程优先级的信息。我按 Ctrl+F 浏览了API 参考中所有与线程相关的部分,但没有发现任何与优先级相关的内容。谷歌似乎也不知道任何事情。
那么在 2.32 API 中是否可以为线程分配优先级呢?如果是,如何在创建时执行此操作?是否可以在创建线程后更改它?我知道 pthread 支持所有这些,但我更愿意坚持使用独立于平台的 Glib API。
如何在Erlang中获得加密强大的随机数,相当于在Unix上读取/ dev/random?
到目前为止,我只看到了使用随机的建议:使用now()这样的东西进行统一和播种,这种方法不够强大.
(是的,我知道它在BSD上是伪随机的,但显然他们认为它足够好,如果不是,那就是他们的问题).
erlang ×3
linux ×2
api ×1
cryptography ×1
daemon ×1
erlang-otp ×1
glib ×1
random ×1
systemd ×1
unix ×1