ydf0509 / funboost

pip install funboost,python全功能分布式函数调度框架,funboost的功能是全面性重量级,用户能想得到的功能99%全都有;funboost的使用方式是轻量级,只有@boost一行代码需要写。支持python所有类型的并发模式和一切知名消息队列中间件,支持如 celery dramatiq等框架整体作为funboost中间件,python函数加速器,框架包罗万象,用户能想到的控制功能全都有。一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数,99%用过funboost的pythoner 感受是 简易 方便 强劲 强大,相见恨晚 。
Apache License 2.0
682 stars 135 forks source link

使用文档4.32中的类方法方法push信息时,总是报错类没有__name__属性【用户使用错误】 #120

Closed ml-ruan closed 2 months ago

ml-ruan commented 2 months ago

image image image

ydf0509 commented 2 months ago

你这个传参明显是错的啊, 类方法传参第一个入参cls应该是 类型本身, 实例方法传参的第一个入参是类的实例。 你push DatectFlaw类型的对象肯定是错的。 你要直接传这个类,而不是类的对象

ydf0509 commented 2 months ago

image

要懂 类方法和实例方法的第一个入参cls和self的实质。 前者是类本身,后者是该类型的对象

ydf0509 commented 2 months ago

你自己想想,对于类方法,你平时咋调用的。类方法和静态方法都是 A.func(1,2) 这样吧。 实例方法是 A(1).funb(1,2) 这样吧。 类方法并不需要使用对象才能调用,类方法中不能访问self的属性,你使用对象.类方法和类的类方法是一样的,如果你一定要访问对象的属性,那应该定义成实例方法。 这应该是面向对象的本质和基础知识。

ydf0509 commented 2 months ago

我有点好奇你这类的定义,你实例化这个DetectFlaw类时候传了参数“EL” 和 detect_list,应该是init中接受了处理成了相关的实例属性, 但你的run中如果与 DetectFlaw的 “EL” 和 detect_list 传的参数有关系,那么怎么会声明成类方法,我对你的DetectFlaw类定义相当好奇

ml-ruan commented 2 months ago

我的run函数在执行之前,需要根据传入参数对类进行初始化,初始化时读取配置文件中的内容,再根据初始化后类的实例属性,对图片进行处理

ml-ruan commented 2 months ago

是我理解出错误类方法与实例方法,十分感谢

ml-ruan commented 2 months ago

Traceback (most recent call last): File "elboost.py", line 46, in DetectFlaw.run.push(DetectFlaw("EL", detect_list), img) File "/data/condaEnvs/el/lib/python3.8/site-packages/funboost/core/booster.py", line 136, in _safe_push return consumer.publisher_of_same_queue.push(*func_args, **func_kwargs) File "/data/condaEnvs/el/lib/python3.8/site-packages/funboost/publishers/base_publisher.py", line 285, in push return self.publish(msg_dict) File "/data/condaEnvs/el/lib/python3.8/site-packages/funboost/publishers/base_publisher.py", line 217, in publish self.concrete_realization_of_publish)(json.dumps(msg, ensure_ascii=False)) File "/data/condaEnvs/el/lib/python3.8/site-packages/funboost/utils/json_helper.py", line 37, in _dumps return cls( File "/data/condaEnvs/el/lib/python3.8/json/encoder.py", line 199, in encode chunks = self.iterencode(o, _one_shot=True) File "/data/condaEnvs/el/lib/python3.8/json/encoder.py", line 257, in iterencode return _iterencode(o, 0) File "/data/condaEnvs/el/lib/python3.8/site-packages/funboost/utils/json_helper.py", line 26, in default return json.JSONEncoder.default(self, obj) File "/data/condaEnvs/el/lib/python3.8/json/encoder.py", line 179, in default raise TypeError(f'Object of type {o.class.name} ' TypeError: Object of type ndarray is not JSON serializable

使用了实例方法后,还是会提示类无法通过Json序列化,是因为只支持使用实例属性,而不支持其它实例方法吗?

ydf0509 commented 2 months ago

不是,你没看文档吧,文档说的很清楚,@boost的函数的入参,必须是简单类型,不能是自定义类型。也就是消费函数入参必须是 数字 字符串 列表 字典这些的,你函数入参是 包括 ndarray 就是不行

ydf0509 commented 2 months ago

def fun(a,b) ,其中的a b不可以是 python中的自定义类型,懂了吗。 就是不能把自定义类A和A的 A(1),B(1)对象 作为函数的入参,懂了吗。

ydf0509 commented 2 months ago

你懂我说的什么是基本类型和自定义类型不? 你能 json.dumps python的自定义类型返回给接口和前端吗?

ydf0509 commented 2 months ago

image

你直接把这个例子复制运行不行吗,这个例子不是包括了 实例方法 类方法 静态方法 和普通函数四种情况了吗。

我说的是你函数入参不能是自定义类型,懂了不,就是自定义类型不能作为消费函数的入参

ml-ruan commented 2 months ago

懂了懂了,我以为nadarry格式的图片也是简单类型了。

ydf0509 commented 2 months ago

nadarry肯定不是基本类型,list是是基本类型,不能被json,dumps的都不是基本类型

ydf0509 commented 2 months ago

你这个很容易改造啊,你run传参 img_path 图片路径字符串不行吗,不要传img对象

ydf0509 commented 2 months ago

image 你这里传img的路径不是香多了吗,你传一个img对象,就算funboost能支持自定义类型,你想下消息队列要存多大的空间,浪费流量和消息队列内存

ml-ruan commented 2 months ago

是的,谢谢,我这边后面使用这个部署到服务器上,后面考虑把图片转成base64字符串格式使用,目前在看怎么解决多个CUDA调用子进程的问题 image

ydf0509 commented 2 months ago

你这个问题我知道很容易解决。设置多进程模式为spawn就好了,很简单经典的问题

ml-ruan commented 2 months ago

好的,多谢,大佬能不能再请教一下,现在我使用框架将Yolo模型加载到GPU上进行检测,但是每次都开进程重加载一遍模型耗时太长了,有没有办法加载一遍模型后重复使用

ydf0509 commented 2 months ago

那看你用的什么python版本,搜索一下多进程内存共享。