これは実際にはスタックオーバーフローに関する最初の質問ですが、実際には解決できないように見える問題がありました。倹約を通じて erlang クライアントを呼び出す Python サーバーを作成しています。私が倹約で作成した唯一の関数は、整数を取り込んで bar (integer) を出力する bar と呼ばれるものです。こちらが Python クライアントです。それほど複雑ではありません。
#!/usr/bin/env python
import sys
sys.path.append('../gen-py')
from foo import Foo
from foo.ttypes import *
from foo.constants import *
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
try:
# Make socket
transport = TSocket.TSocket('localhost', 9999)
# Buffering is critical. Raw sockets are very slow
transport = TTransport.TBufferedTransport(transport)
# Wrap in a protocol
protocol = TBinaryProtocol.TBinaryProtocol(transport)
# Create a client to use the protocol encoder
client = Foo.Client(protocol)
# Connect!
transport.open()
msg = client.bar(1452)
print msg
transport.close()
except Thrift.TException, tx:
print "%s" % (tx.message)
これは、ポート 9999 でリッスンしている私のリサイクル クライアントです。
-module(foo_service).
-include("foo_thrift.hrl").
-include("foo_types.hrl").
-export([start_link/0, stop/1,
handle_function/2,
% Thrift implementations
% FILL IN HERE
bar/1]).
%%%%% EXTERNAL INTERFACE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
start_link() ->
thrift_socket_server:start ([{port, get_port()},
{name, ?MODULE},
{service, foo_thrift},
{handler, ?MODULE},
{framed, true},
{socket_opts, [{recv_timeout, 60*60*1000}]}]).
stop(_Server) ->
thrift_socket_server:stop (?MODULE),
ok.
%%%%% THRIFT INTERFACE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
handle_function(Function, Args) when is_atom(Function), is_tuple(Args) ->
case apply(?MODULE, Function, tuple_to_list(Args)) of
ok -> ok;
Reply -> {reply, Reply}
end.
%%%%% HELPER FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
get_port() ->
{ok, Result} = application:get_env(foo, service_port),
Result.
%% ADD THRIFT FUNCTIONS HERE
bar(I) ->
io:format("bar (~p)~n", [I]).
そこで、thrift クライアントを起動し、python サーバーから client.bar(1452) を呼び出すと、残念ながら子エラーが発生します。
=CRASH REPORT==== 5-Jul-2013::08:34:32 ===
crasher:
initial call: thrift_socket_server:acceptor_loop/1
pid: <0.51.0>
registered_name: []
exception error: no function clause matching
thrift_socket_transport:read({data,#Port<0.1067>,3600000},
-2147418111) (src/thrift_socket_transport.erl, line 53)
in function thrift_transport:read/2 (src/thrift_transport.erl, line 67)
in call from thrift_framed_transport:read/2 (src/thrift_framed_transport.erl, line 79)
in call from thrift_transport:read/2 (src/thrift_transport.erl, line 67)
in call from thrift_binary_protocol:read_data/2 (src/thrift_binary_protocol.erl, line 315)
in call from thrift_binary_protocol:read/2 (src/thrift_binary_protocol.erl, line 286)
in call from thrift_binary_protocol:read/2 (src/thrift_binary_protocol.erl, line 175)
in call from thrift_protocol:read_specific/2 (src/thrift_protocol.erl, line 186)
ancestors: [foo_service,foo_sup,<0.46.0>]
messages: []
links: [<0.48.0>,#Port<0.1067>]
dictionary: []
trap_exit: false
status: running
heap_size: 987
stack_size: 27
reductions: 513
neighbours:
=ERROR REPORT==== 5-Jul-2013::08:34:32 ===
{thrift_socket_server,244,{child_error,function_clause,[]}}
何か案は?助けてくれてありがとう!