【问题标题】:how to stop initial class when use nameko run a service使用nameko运行服务时如何停止初始类
【发布时间】:2020-02-24 07:54:14
【问题描述】:

您好,这是我的项目示例,我想使用nameko run Test:A, 而且我发现 class A 在运行此服务期间会反复初始化。 实际上,我想连接到一个服务并重复做一些事情,我不想每次都初始化连接。那么有什么好的方法可以解决这个问题吗?

###FileName:Test.py###
from nameko.timer import timer
import time
class A:
    name = 'test'
    def __init__(self):
        self.a = 'a'
        print('this class has been init')

    @timer(interval=0)
    def test(self):
        try:
            print('this is a nameko method')
        except:
            pass
        time.sleep(1)

    @timer(interval=2)
    def test2(self):
        try:
            print('second nameko method')
        except:
            pass
        time.sleep(3)```

【问题讨论】:

    标签: python nameko


    【解决方案1】:

    Nameko 服务以类的形式实现,但在面向对象编程方面,它们的行为与普通类不同。

    特别是,每个工作人员都会实例化该类,即每次触发入口点时。这就是为什么你一遍又一遍地看到“这个类已经初始化”的原因。

    一般来说,您不应在 Nameko 服务类中使用构造函数。

    要管理服务的连接和一次性设置,您应该使用DependencyProvider

    【讨论】:

      【解决方案2】:

      你可以试试:

      class A:
          name = 'test'
          def __init__(self):
              try:
                  self.a
              except Exception as e:
                  print (e)
                  self.a = 'a'
              print('this class has been init')
      

      这将检查self.a 是否已在范围内,如果是,则不会将其分配给'a'。否则,它会这样做。

      如果这不是您想要的,您也可以将a 设为类变量而不是实例变量。

      class A:
          name = 'test'
          def __init__(self):
              try:
                  A.a
                  print (A.a) #nothing
              except Exception as e:
                  print (e)
                  A.a = 'a'
                  print (A.a) #created
              print('this class has been init')
      

      【讨论】:

      • 对不起,它不起作用。这是结果starting services: test 'A' object has no attribute 'a' this class has been init this is a nameko method 'A' object has no attribute 'a' this class has been init this is a nameko method
      • 似乎如果我使用@time 属性,nameko 将始终初始化类 A
      • 它不起作用是什么意思?创建 A 对象后无法调用 A.a 吗?
      • 在这种情况下,nameko 将始终运行 init 并重新创建 A.a
      • 在我给出的第二个代码 sn-p 中,它将运行 init 而不会重新创建 A.a
      猜你喜欢
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多