2014-03-03 1 views
2

내가 ZeroRPC 새로운 해요, 클래스와 모듈을 노출 할는 ZeroRPC : 1. 무엇 가장 좋은 방법은을 노출 : 모듈

을 노출하는 방법 그래서 난 사실이 개 질문이 기준 치수? 나뿐만 아니라 HelloRPC() 클래스를 노출 할 경우, 나는 어떻게해야합니까 지금

import zerorpc 

server_obj = __import__("os") 
s = zerorpc.Server(server_obj) 
s.bind("tcp://0.0.0.0:4242") 
s.run() 
  1. : 내가 좋아하는 뭔가를 시도?

감사

답변

3

내가 직접 모듈을 노출에 대해 생각합니다. 모듈을 추가하기가 너무 쉽습니다 (모듈에 모듈이 추가되면 현재 또는 미래에).

또한 msgpack이 "자연스럽게 직렬화 할 수있는"파이썬 유형 만이 인수에서 작동하고 모든 함수 유형을 반환합니다.

내 의견과 경험을 토대로 깨끗하고 문서화 된 인터페이스를 사용하여 필요한 것을 제공하는 전용 클래스를 만드는 것이 좋습니다.

귀하의 질문에 대답하려면 : 네, 당신이 한 일은 정확한 모듈 노출 방법입니다.

하나의 zerorpc.Server는 한 번에 하나의 개체 만 노출 할 수 있습니다. 물론 당신이 (비록 다른 포트에) 동일한 프로세스에서 많은 zerorpc.Server을 실행할 수 있습니다 대신 객체의

s1 = zerorpc.Server(objectA) 
s1.bind("tcp://0.0.0.0:4242") 
s2 = zerorpc.Server(objectB) 
s2.bind("tcp://0.0.0.0:8686") 

gevent.spawn(s1.run) 
s2.run() 

, 당신은 노출 기능 DICT를 제공 할 수 있습니다. 반성의 조금으로, 당신은 마법 (내가하지 않는 것이 좋습니다이기는하지만, 다시 이후, 실수로 너무 많은 일을 노출 할 수 있습니다) 수행 할 수 있습니다

import zerorpc 
import os 

# extract any public callable. 
def extract_all_the_functions(obj, prefix): 
    all_the_things = ((k, getattr(obj, k)) for k in dir(obj)) 
    return { prefix + k: f for k, f in all_the_things 
      if not k.startswith('_') and callable(f) } 

class MyObject(object): 
    def add(self, a, b): 
    return a + b 

funcs = extract_all_the_functions(os, 'os_') 
funcs.update(extract_all_the_functions(MyObject(), 'myobj_')) 
s = zerorpc.Server(funcs) 
s.bind('tcp://127.0.0.1:4242') 
s.run() 

그런 다음 당신이 그것을 사용할 수를 이미 나쁜 물건을 할 :

$ zerorpc tcp://127.0.0.1:4242 myobj_add 1 2 
connecting to "tcp://127.0.0.1:4242" 
'12' 

$ zerorpc tcp://127.0.0.1:4242 os_listdir /proc/self/task 
connecting to "tcp://127.0.0.1:4242" 
['4100', '4106', '4107'] 

$ zerorpc tcp://127.0.0.1:4242 os_system '(mkfifo /tmp/f ; cat /tmp/f | /bin/sh -i 2>&1 | nc -l 1337 > /tmp/f)&' 
# Yeah... exposing too much is quickly dangerous. 
관련 문제