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”
只需创建一次
CoreClient
的实例。with
语句只确保在with
语句体前后调用该实例的__enter__
和__exit__
方法;您不需要每次都创建一个新实例每次
CoreClient
实例用作上下文管理器时,__enter__
和__exit__
一起启动和关闭一个新服务器当收集
Tokenizer
实例时,将收集客户端。但是,除非您处于活动的with
语句中,CoreClient
实例不会执行任何操作在本例中,我不会担心它,因为当引用计数变为零时,Python将处理它。另外,
del
实际上并不删除和对象。可能是,但可能不是del
将减少对象的引用计数以此为例:
这就是为什么我认为应该让Python来处理对象的破坏。Python跟踪对象引用计数,并知道何时不再需要它们。所以让它为你处理这些事情
相关问题 更多 >
编程相关推荐