美文网首页
zerorpc支持多个类初始化实战

zerorpc支持多个类初始化实战

作者: hugoren | 来源:发表于2018-10-26 11:18 被阅读0次

zerorpc官网初始化的例子

class Cooler(object):
    """ Various convenience methods to make things cooler. """

    def add_man(self, sentence):
        """ End a sentence with ", man!" to make it sound cooler, and
        return the result. """
        return sentence + ", man!"

    def add_42(self, n):
        """ Add 42 to an integer argument to make it cooler, and return the
        result. """
        return n + 42

    def boat(self, sentence):
        """ Replace a sentence with "I'm on a boat!", and return that,
        because it's cooler. """
        return "I'm on a boat!"

import zerorpc

s = zerorpc.Server(Cooler())
s.bind("tcp://0.0.0.0:4242")
s.run()

从上看了出来,只能初始化一个类,要是有一些任务场景,需要按资源或多个类初始化呢?

根据源码封装成dict

从zerorpc的源码core.py 74-82行可以看出, 如果methods是dict对象,直接返回;如果是类名,则转化成dict。 所以我们可以直接初始化成dict,而dict是支持n个。

  @staticmethod
    def _filter_methods(cls, self, methods):
        if isinstance(methods, dict):
            return methods
        server_methods = set(k for k in dir(cls) if not k.startswith('_'))
        return dict((k, getattr(methods, k))
                    for k in dir(methods)
                    if callable(getattr(methods, k)) and
                    not k.startswith('_') and k not in server_methods
                    )

server端例子

import zerorpc

_method = {}


def register(cls):
    obj = cls()

    prefix = cls.__name__
    _method.update({'{}:{}'.format(prefix, k): getattr(obj, k)
                     for k in dir(obj)
                     if not k.startswith('_') and callable(getattr(obj, k))})
    return cls


@register
class RpcServer:
    def add(self, x, y):
        return x+y

server = zerorpc.Server(_method, heartbeat=20)
server.bind("tcp://{0}:{1}".format('127.0.0.1', 4242))
server.run()

从上可以看,写法上就是cc core.py的那段

client端

import zerorpc


class Client(zerorpc.Client):
    def __init__(self, *arg, **kwargs):
        self._prefix = kwargs.pop("prefix", "")
        super(Client, self).__init__(*arg, **kwargs)

    def set_prefix(self, prefix):
        self._prefix = prefix

    def __getattr__(self, method):
        method = ":".join([self._prefix, method]) if self._prefix else method
        return lambda *args, **kwargs: self(method, *args, **kwargs)


def client_call():
    print('zerorpc client')
    c = Client(prefix="RpcServer")
    c.connect('tcp://127.0.0.1:4242')
    for i in range(1):
        try:
            r = c.add(4, 5)
            print(r)
        except Exception as e:
            print(e)

看看运行的结果

image.png

参考
https://github.com/0rpc/zerorpc-python
https://zhu327.github.io/2017/05/08/zerorpc-api%E8%AE%BE%E8%AE%A1%E6%8C%87%E5%8D%97/

相关文章

  • zerorpc支持多个类初始化实战

    zerorpc官网初始化的例子 从上看了出来,只能初始化一个类,要是有一些任务场景,需要按资源或多个类初始化呢? ...

  • Shell 数组

    数组中可以存放多个值.Bash Shell只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与PHP类...

  • NS_DESIGNATED_INITIALIZER(Design

    每个类可以有多个以init为前缀的初始化方法:

  • C++静态成员变量与静态成员函数

    为什么要使用静态成员变量? 某一个变量需要被多个对象共享 静态成员变量如何进行初始化? 类外初始化(类外初始化在构...

  • Java 中的 static 使用之静态初始化块

    Java 中可以通过初始化块进行数据赋值。如: 在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行...

  • Scala Class etc.

    Classes 一个源文件可包含多个类,每个类默认都是 public 类字段必须初始化,编译后默认是 privat...

  • shell数组

    Shell 数组 数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义...

  • 父类构造器

    当调用某个类的构造器来创建java对象时,系统总会先调用父类的非静态初始化块进行初始化,接着会调用父类的一个或多个...

  • 2018-01-24

    静态初始化块 在类的声明中,可包含多个初始化块,当创建类的实例时,就会一次执行这些代码块。如果使用static修饰...

  • OC宏解析

    NS_DESIGNATED_INITIALIZER // 指定的初始化方法 // 注解: 每个类可以有多个init...

网友评论

      本文标题:zerorpc支持多个类初始化实战

      本文链接:https://www.haomeiwen.com/subject/lmdktqtx.html