我正在尝试使用Thespian(https://thespianpy.com/doc/),它是用于actor模型的Python库,尤其是我正在尝试使用“剧团”功能。据我了解,团队装饰器充当调度程序,以运行多个actor达到指定的max_count,每个actor并行运行。剧团功能被用作演员类的装饰器:
@troupe(max_count = 4, idle_count = 2)
class Calculation(ActorTypeDispatcher):
def receiveMsg_CalcMsg(self, msg, sender):
self.send(sender, long_process(msg.index, msg.value, msg.status_cb))
我想在运行时而不是设计时配置max_count。我承认我对装饰者的基本知识很薄。
如何在运行时将值传递给max_count?
我经历了这些,但是我仍然处于黑暗之中:
Does python allow me to pass dynamic variables to a decorator at runtime?
http://simeonfranklin.com/blog/2012/jul/1/python-decorators-in-12-steps/
根据目前为止的所有答案,我尝试了此操作,但是未应用装饰器(即,它的作用就好像没有装饰器一样)。我在类上方注释了@troupe实现,该方法(包括变量)工作正常。这种方法不是:
# @troupe(max_count=cores, idle_count=2)
class Calculation(ActorTypeDispatcher):
def receiveMsg_CalcMsg(self, msg, sender):
self.send(sender, long_process(msg.index, msg.value, msg.status_cb))
def calculate(asys, calc_values, status_cb):
decorated_class = troupe(max_count=5, idle_count=2)(Calculation)
calc_actor = asys.createActor(decorated_class)
calculate
函数中还有其他内容,但这几乎只是一些记账。
答案 0 :(得分:4)
装饰器语法只是将函数应用于类的快捷方式。
一旦知道max_count
的值,就可以使该函数自己调用。
class Calculation(ActorTypeDispatcher):
...
# Time passes
c = input("Max count: ")
Calculation = troupe(max_count=int(c), idle_count=2)(Calculation)
(或者,只需等到做有c
,然后再将Calculation
定义为shown by @brunns。)
答案 1 :(得分:2)
应该像这样简单:
my_max = get_max_from_config_or_wherever()
@troupe(max_count = my_max, idle_count = 2)
class Calculation(ActorTypeDispatcher):
...
要记住的是,class
和def
语句本身是执行的。