2014-03-03 82 views
2

我是新與ZeroRPC,ZeroRPC:如何公開一個模塊

我要揭露類和模塊, 所以其實我有2個問題: 1.什麼是最好的方式來揭露模塊? 我想是這樣的:

import zerorpc 

server_obj = __import__("os") 
s = zerorpc.Server(server_obj) 
s.bind("tcp://0.0.0.0:4242") 
s.run() 
  1. 現在,如果我要揭露HelloRPC()類爲好,我該怎麼辦呢?

感謝

回答

3

我反對直接暴露的模塊。它使得暴露超過你想要的(現在或未來,如果在模塊中添加任何東西的話)更容易。

此外,只有通過msgpack「自然可序列化」的python類型才能在參數中工作並返回任何函數的類型。

根據我的唯一意見和經驗,最好創建一個專門的類,只顯示您需要的內容,並提供一個乾淨且有文檔的界面。

要回答你的問題:是的,你所做的是暴露模塊的正確方法。

一個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() 

而是一個對象,你可以提供的功能暴露的字典。隨着內省的一點點,你可以做一些神奇的(雖然我不建議,因爲再次,您可以通過錯誤暴露了太多的東西):

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.