Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ZeroMQ经销商插座没有';t在长生不老药下工作(使用Erlang和chumak)_Erlang_Elixir_Zeromq_Chumak - Fatal编程技术网

ZeroMQ经销商插座没有';t在长生不老药下工作(使用Erlang和chumak)

ZeroMQ经销商插座没有';t在长生不老药下工作(使用Erlang和chumak),erlang,elixir,zeromq,chumak,Erlang,Elixir,Zeromq,Chumak,我想在Elixir和Python之间进行通信。我不想使用NIFs之类的东西——我更喜欢使用zeroMQ进行松散耦合,因为这将允许我以后使用Python以外的其他语言。我使用的库是Erlang中zeromq的本机实现,并且似乎维护良好。我过去曾成功地将其应用于酒吧sub 除了pub-sub,我发现req-rep和req-router套接字工作正常。然而,经销商路由器没有。这非常重要,因为在zeromq中只有经销商和路由器提供真正的异步 以下是路由器端的python代码: import zmq co

我想在Elixir和Python之间进行通信。我不想使用NIFs之类的东西——我更喜欢使用zeroMQ进行松散耦合,因为这将允许我以后使用Python以外的其他语言。我使用的库是Erlang中zeromq的本机实现,并且似乎维护良好。我过去曾成功地将其应用于酒吧sub

除了pub-sub,我发现req-rep和req-router套接字工作正常。然而,经销商路由器没有。这非常重要,因为在zeromq中只有经销商和路由器提供真正的异步

以下是路由器端的python代码:

import zmq
context = zmq.Context()
rout = context.socket(zmq.ROUTER)
rout.bind("tcp://192.168.1.192:8760")
In [5]: xx = rout.recv_multipart()
In [6]: xx
Out[6]: ['reqid', '', 'hello from req socket']
In [7]: dd = rout.recv_multipart()
In [8]: dd
Out[8]: ['Thomas', 'hello from python deal']
这是Elixir req代码,它工作得很好

iex(1)> {ok, sock1} = :chumak.socket(:req, 'reqid')
{:ok, #PID<0.162.0>}
iex(2)> {ok, _peer} = :chumak.connect(sock1, :tcp, '192.168.1.192', 8760)
{:ok, #PID<0.164.0>}
iex(3)> :chumak.send(sock1, 'hello from req socket')
:ok
但是,如果我尝试在长生不老药一侧使用经销商插座,我会得到以下结果:

iex(4)> {ok, sock2} = :chumak.socket(:dealer, 'dealid')                  
{:ok, #PID<0.170.0>}
iex(5)> {ok, _peer} = :chumak.connect(sock2, :tcp, '192.168.1.192', 8760)
{:ok, #PID<0.172.0>}
iex(6)> :chumak.send(sock2, 'hello from dealer socket')
{:error, :not_implemented_yet}
iex(7)> :chumak.send_multipart(sock2, ['a', 'b', 'hello from dealer socket'])

22:13:38.705 [error] GenServer #PID<0.172.0> terminating
** (FunctionClauseError) no function clause matching in :chumak_protocol.encode_more_message/3
    (chumak) /home/tbrowne/code/elixir/chutest/deps/chumak/src/chumak_protocol.erl:676: :chumak_protocol.encode_more_message('a', :null, %{})
    (stdlib) lists.erl:1354: :lists.mapfoldl/3
    (chumak) /home/tbrowne/code/elixir/chutest/deps/chumak/src/chumak_protocol.erl:664: :chumak_protocol.encode_message_multipart/3
    (chumak) /home/tbrowne/code/elixir/chutest/deps/chumak/src/chumak_peer.erl:159: :chumak_peer.handle_cast/2
    (stdlib) gen_server.erl:616: :gen_server.try_dispatch/4
    (stdlib) gen_server.erl:686: :gen_server.handle_msg/6
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
Last message: {:"$gen_cast", {:send, ['a', 'b', 'hello from dealer socket'], {#PID<0.160.0>, #Reference<0.79795089.2401763329.172383>}}}
State: {:state, :ready, '192.168.1.192', 8760, :client, [], :dealer, 'dealid', [], {3, 0}, #Port<0.4968>, {:decoder, :ready, 0, nil, nil, {:some, 3}, {:some, 0}, %{}, :null, false}, #PID<0.170.0>, {[], []}, [], false, false, false, :null, %{}}

22:13:38.710 [info]  [:unhandled_handle_info, {:module, :chumak_socket}, {:msg, {:EXIT, #PID<0.172.0>, {:function_clause, [{:chumak_protocol, :encode_more_message, ['a', :null, %{}], [file: '/home/tbrowne/code/elixir/chutest/deps/chumak/src/chumak_protocol.erl', line: 676]}, {:lists, :mapfoldl, 3, [file: 'lists.erl', line: 1354]}, {:chumak_protocol, :encode_message_multipart, 3, [file: '/home/tbrowne/code/elixir/chutest/deps/chumak/src/chumak_protocol.erl', line: 664]}, {:chumak_peer, :handle_cast, 2, [file: '/home/tbrowne/code/elixir/chutest/deps/chumak/src/chumak_peer.erl', line: 159]}, {:gen_server, :try_dispatch, 4, [file: 'gen_server.erl', line: 616]}, {:gen_server, :handle_msg, 6, [file: 'gen_server.erl', line: 686]}, {:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 247]}]}}}]
现在在路由器端:

import zmq
context = zmq.Context()
rout = context.socket(zmq.ROUTER)
rout.bind("tcp://192.168.1.192:8760")
In [5]: xx = rout.recv_multipart()
In [6]: xx
Out[6]: ['reqid', '', 'hello from req socket']
In [7]: dd = rout.recv_multipart()
In [8]: dd
Out[8]: ['Thomas', 'hello from python deal']
所以我想知道我的Elixir chumak dealer套接字中是否有语法或类型错误,或者这仅仅是一个bug。我在amd64和armv7l体系结构上都尝试过,问题是相同的

所有elixir代码都基于经销商路由器中的Erlang版本

我的mix.exs deps如下所示:

 [
      {:chumak, "~> 1.2"},
      {:msgpack, "~> 0.7.0"}

 ]

我看到的唯一明显的事情是使用send_multipart。其在来源中的签名:

-spec send_multipart(SocketPid::pid(), [Data::binary()]) -> ok.
您正在这样做:

:chumak.send_multipart(sock2, ['a', 'b', 'hello from dealer socket'])

------------
iex(2)> is_binary('a')
false
iex(3)> is_binary('hello from dealer socket')
false

否则,我看不出您的代码与chumak的repo中的示例代码有多大区别。

Nice。我刚刚使用:chumak.send_multipart(sock2,[,]进行了测试,效果很好。所以基本上我有一个类型错误。我认为我需要通过单引号机制使用erlang二进制文件,但实际上它将使用Elixir二进制文件,例如[“123”,“456”])。太棒了。