是否需要显式删除此对象?

2024-09-30 03:25:12 发布

您现在位置:Python中文网/ 问答频道 /正文

class Tokenizer()

def __init__(self):
   self.name = 'MyTokenizer'
   self.tokenizer = Language.create_tokenizer(nlp)

def __call__(self, text):
   if text:
      with CoreClient(timeout=60000) as client:
         doc = client.annotate(text, output_format='json')
   else:
      doc = Document("")

   ...

我面临的问题是“CoreClient”的创建,它创建了一个到服务器的http请求。“with…as client”引入的当前代码可以确保在“client.annotate”完成后超出范围时客户端被销毁。然而,问题是,必须为每个处理“文本”的请求创建对象“客户端”。为了避免这种情况,我最好在init方法中创建对象:

self.client = CoreClient(timeout=60000)

但是:

1) How to destroy the 'client' after all requests have been completed? OR
2) Is the current way of creating a Coreclient OK for each request? The creation of the object is heavy, which needs a lot of initialization.

编辑:

def __enter__(self):
    self.start()
    return self

def start(self):
    if self.start_cmd:
        if self.be_quiet:
            # Issue #26: subprocess.DEVNULL isn't supported in python 2.7.
            stderr = open(os.devnull, 'w')
        else:
            stderr = self.stderr
        print(f"Starting server with command: {' '.join(self.start_cmd)}")
        self.server = subprocess.Popen(self.start_cmd,
                                       stderr=stderr,
                                       stdout=stderr)

为了更清楚,我添加了方法enter的实现。它似乎只是返回对象“self”


Tags: ofthetextselfcmdclientifinit
2条回答

只需创建一次CoreClient的实例。with语句只确保在with语句体前后调用该实例的__enter____exit__方法;您不需要每次都创建一个新实例

class Tokenizer()

    def __init__(self):
       self.name = 'MyTokenizer'
       self.tokenizer = Language.create_tokenizer(nlp)
       self.client = CoreClient(timeout=60000)  # Create client here

    def __call__(self, text):
       if text:
          with self.client:
             doc = self.client.annotate(text, output_format='json')
       else:
          doc = Document("")

每次CoreClient实例用作上下文管理器时,__enter____exit__一起启动和关闭一个新服务器

当收集Tokenizer实例时,将收集客户端。但是,除非您处于活动的with语句中,CoreClient实例不会执行任何操作

在本例中,我不会担心它,因为当引用计数变为零时,Python将处理它。另外,del实际上并不删除和对象。可能是,但可能不是del将减少对象的引用计数

以此为例:

In [1]: class Test:
   ...:     def __del__(self):
   ...:         print('deleted')
   ...:

In [2]: t = Test()

In [3]: del t
deleted

In [4]: t = Test()

In [5]: t1 = t

In [6]: del t  # Nothing gets printed here because t1 still exists

In [7]: del t1  # reference count goes to 0 and now gets printed
deleted

这就是为什么我认为应该让Python来处理对象的破坏。Python跟踪对象引用计数,并知道何时不再需要它们。所以让它为你处理这些事情

相关问题 更多 >

    热门问题