Я пытаюсь использовать Thespian (https://thespianpy.com/doc/), библиотеку Python для модели актера, и, в частности, я пытаюсь использовать функциональность "труппы". Насколько я понимаю, декоратор труппы действует как планировщик для запуска нескольких акторов до указанного max_count, при этом каждый актер работает параллельно. Функциональность труппы применяется в качестве декоратора в моем актерском классе:
@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 во время выполнения?
Я прошел через это, но я все еще в неведении:
Позволяет ли python передавать динамические переменные декоратору во время выполнения?
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
есть и другие вещи, но это в основном просто бухгалтерский учет.
Синтаксис декоратора - это просто ярлык для применения функции к классу. Вы можете заставить эту функцию вызывать себя, как только узнаете значение для max_count
.
class Calculation(ActorTypeDispatcher):
...
# Time passes
c = input("Max count: ")
Calculation = troupe(max_count=int(c), idle_count=2)(Calculation)
(или просто подождите, пока у вас не появится c
прежде чем определять Calculation
, как показано @brunns.)
Должно быть так просто, как:
my_max = get_max_from_config_or_wherever()
@troupe(max_count = my_max, idle_count = 2)
class Calculation(ActorTypeDispatcher):
...
Следует помнить, что операторы class
и def
выполняются сами.
calc_actor = asys.createActor(Calculation)
decorated_class= troupe()(Calculation)
. Должно ли быть так, как вы иллюстрировали, сCalculation = troupe()(Calculation)
? Когда я это делаю, я получаюUnboundLocalError: local variable 'Calculation' referenced before assignment
. И да, мой класс вычисления определен до вызова, который я пытаюсь сделать.