gpt4 book ai didi

Erlang:从共享队列中推送和拉取

转载 作者:行者123 更新时间:2023-12-04 02:20:49 29 4
gpt4 key购买 nike

我需要维护一个共享队列,我可以在其中推送数据,如果队列不为空,一个单独的线程将定期检查并从队列中提取数据。我想出了下面的解决方案,我可以在其中将数据发送到流程并将其加起来到一个列表中。但是,是否有更清洁/更简单的解决方案来做到这一点?

我不确定如何从下面的代码中提取数据。

-module(abc).
-export(queue/0).
queue() ->
receive
{push, Xmpp} ->
io:format("Push"),
queue(Xmpp);
{pull} ->
io:format("pull"),
queue()
end.

queue(E) ->
receive
{push, Xmpp} ->
io:format("Push ~w",[E]),
E1 = lists:append([E],[Xmpp]),
queue(E1);
{reset} ->
queue([])
end.

最佳答案

代码可能不会完全按照您所写的方式执行。当您从 receive block (第 7 行的 queue(Xmpp);)调用 queue/1 时,queue/1 将触发然后等待消息。因为这不是在单独的进程中产生的,queue/0 将阻塞(因为 queue/1 现在正在等待一条从未发送过的消息)。

另外,queue/0 永远不会向发送消息的进程发送任何东西。它无法将数据返回给发送方。

以下将起作用(您需要将消息发送到 queue/0 返回的 pid)。

-module(abc).
-export([queue/0,queue/1]).

queue() ->
%% initialize an empty queue,
%% return the Pid to the caller
spawn(abc,queue,[[]]).




queue(E) when is_list(E) ->
receive
%% append the message value to the existing list
{push, Xmpp} ->
io:format("Pushing ~w to ~w~n",[Xmpp,E]),
E1 = lists:append(E,[Xmpp]),
queue(E1);

%% reset the queue
{reset} ->
queue([]);

%% return the value to the caller
%% "Pid" must be a Pid
{pull, Pid} when is_pid(Pid) ->
io:format("pull~n"),
Pid ! E,
queue(E)
end.

关于Erlang:从共享队列中推送和拉取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29760092/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com