- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在自动启动监督树时遇到了死锁问题。一个 GenServer 的初始状态是树中另一个主管的子进程。代码如下:
主管和 worker :
defmodule Parallel.Worker.Supervisor do
import Supervisor.Spec
def start_link do
# Start up a worker for each core
schedulers = :erlang.system_info(:schedulers)
children = Enum.map(1..schedulers,
&(worker(Parallel.Worker.Server, [], id: "Parallel.Worker#{&1}")))
opts = [strategy: :one_for_one, name: Parallel.Worker.Supervisor]
Supervisor.start_link(children, opts)
end
def workers do
Process.whereis(Parallel.Supervisor)
|> Supervisor.which_children
|> Enum.reduce [], fn
{_name, pid, :worker, _module}, acc -> [{make_ref, pid} | acc]
_, acc -> acc
end
end
end
GenServer 以及这些工作进程 pid 的状态:
defmodule Parallel.Process.Server do
use GenServer
def start_link do
GenServer.start_link(__MODULE__, workers: [Parallel.Worker.Supervisor.workers])
end
end
正如您在最后一行所看到的,我正在调用“Parallel.Worker.Supervisor.workers”,它似乎会阻止等待树上的初始化,直到该方法返回时才会完成。如何将受监督的 PID 作为初始 GenServer 状态?
更新:
我不想使用 poolboy(尽管查看源代码是一个很好的建议)来帮助我了解更多信息。我并不想做任何特别的事情,我的工作人员只是处理传递的函数及其参数。这是工作 GenServer:
defmodule Parallel.Worker do
use GenServer
require Logger
def start_link(state) do
GenServer.start_link(__MODULE__, state, [])
end
def init(state) do
{:ok, state}
end
# Using cast to be async as the job could take longer than the default 5 seconds,
# Don't want client blocked on waiting for job to complete
def handle_cast({:execute, fun, args, return_pid, job_ref}, state) do
Logger.debug fn()-> "#{inspect self}: Recevied job with args: #{inspect args} for job #{inspect job_ref} to return to #{inspect return_pid}" end
send(return_pid, {job_ref, apply(fun, args), self})
{:noreply, state}
end
end
最佳答案
我假设您想在这里创建某种池?正如评论中提到的,你应该看看 poolboy。如果出于练习的目的,您想自己实现这一点,那么仍然值得研究 poolboy 代码以获取灵感。
本质上,poolboy 池由“池管理器”管理 - 一个维护已知工作人员集合的 gen_server。此池管理器进程在内部启动一个 simple_one_for_one
主管,然后用于启动和监督工作人员。
池管理器进程 during initialization first starts the supervisor 。然后,它调用 prepopulate/1
来 start supervised worker processes 。该函数将动态创建N个worker via supervisor:start_child/2 ,并且池管理器可以在内部保留工作进程 pid 列表。
这可以确保池管理器进程在初始化期间不需要与父主管通信(这就是导致死锁的原因)。相反,管理者自己创建 child 。依靠内部监督者仍然可以确保 worker 驻留在监督树中。
还需要一些其他精美的细节来确保一切正常工作。 Poolboy 进程(池管理器)将捕获退出,链接到监视器,并在 worker check out 时对其进行监视。这确保了正确检测工作人员崩溃。我建议阅读代码以进行进一步分析。
我的观点是,这可能是一个有趣的练习,可以更好地理解 OTP。但是,如果您是为了生产而执行此操作,那么直接使用 poolboy 可能会更好。
关于Elixir - GenServer 具有其他几个 GenServer pid 的初始状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27031222/
我很好奇如何从服务器管理初始状态。例如,我们在页面上有一个按钮,只有在用户获得授权后才能启用该按钮。我看到两个选项,但都有缺点: 在 ComponentWillMount() 中,从服务器获取信息。缺
我有一个听另一个集团的集团。更新后flutter_bloc打包至 version 6.0.2 ,监听器在初始状态下不会再调用。 class BlocA extends Bloc { final B
我正在为我的 React 应用程序使用 redux。我正在从 api 获取用户数据,用它更新 redux 状态并将其显示到我的组件中。数据是对象列表。导致我出现问题的是设置 redux 初始状态。 r
我想观察一个由完全独立的代码修改的 ObservableList。我的问题是,我不仅希望在列表更改时调用 ListChangeListener(当我附加监听器时,列表可能已经包含元素),而且我还希望将
正如标题所说,我需要将 TextView、ImageView 和其他 View 重置为初始状态。例如,在触摸该特定 View 后,会播放一个动画,并且它的动画会(视觉上)销毁该 View 。 现在我需
我已经开始开发一个 react native 应用程序,但我的 ListView 的初始化出现问题。 我正在使用react-native-db-models插件来存储和检索我的数据 问题是我想在rea
我正在对时间序列数据使用 lstm。我有关于时间序列的不依赖于时间的特征。想象一下该系列的公司股票以及非时间系列功能中的公司位置之类的东西。这不是用例,但它是相同的想法。对于此示例,我们只预测时间序列
我有一个参与者模型,带有 state_machine last_action。我想根据角色属性设置last_action 的初始值。如果角色为“导师”,则初始值为“值1”,而如果角色为“学生”,则初始
我已经为 LavaLamp 滑动菜单集成了代码,到目前为止效果很好(我遇到了一些问题,但能够通过阅读面板快速解决它们)但是有一件令人沮丧的事情妨碍了我。当您最初加载页面时,菜单悬停背景位于错误的位置,
我想根据从 Home.js 获得的现有 Prop 在 reducer.js 中设置初始状态 我试图调用 home: this.props.homedata 来设置初始状态,但它不起作用。 import
在我的程序中,我有多个网格,但它们非常相似,因此我决定为所有网格制作一个 reducer ,以保持我的代码美观且干燥。当我分派(dispatch)事件以更改存储时,我将网格名称作为参数与有效负载一起发
我是 React 的新手,正在尝试构建一个具有购物车功能的应用程序,用户可以在其中将机器人添加到购物车。我正在使用 Context API 在整个应用程序中提供购物车,并使用 useReducer 为
我是 React 的新手,正在尝试构建一个具有购物车功能的应用程序,用户可以在其中将机器人添加到购物车。我正在使用 Context API 在整个应用程序中提供购物车,并使用 useReducer 为
我有一个功能: test :: String -> State String String test x = get >>= \test -> let test' = x ++ tes
我是 Redux 和 React 的新手,我正在尝试编写一些基本代码。我遇到了一个看起来很愚蠢但无法解决的问题。 这是片段 import React from 'react'; import Reac
我是 JS/React-native 新手,对于如何正确管理 map 初始状态有点困惑。 我有以下组件: import React from 'react'; import { StyleSheet,
嗨,我最近开始使用 Angular 和 Node,但立即遇到了问题。 我有一个简单的 Controller ,用于获取单个对象。一切正常,但我希望能够在 Controller 内初始化范围变量。我不知
我正在使用tf.nn.dynamic_rnn在 tensorflow 中运行 LSTM。我有一个由 N 个初始状态向量组成的张量和一个由 M = N * n 个输入组成的张量。每个系列由n个输入项组成
在 Angular 1.5 应用程序中使用 UIRouter,我在尝试为我的 Angular 模块设置初始状态时遇到问题。 我已经创建了几个没有 URL 的状态(因为我不需要实际路由),我想在模块实例
我是一名优秀的程序员,十分优秀!