我应该如何设置一个spaCy服务器来处理多个并发请求(非阻塞)



我有一个脚本,其中包含一些使用spaCy的数据预处理函数。我需要将脚本作为 REST API 服务器执行,但问题是我没有批量的文本,所以我不能轻松使用 spaCy 的"nlp.pipe(("函数。

我可以使用具有多线程的 gunicorn 将脚本作为烧瓶 REST API 服务器执行,但我需要知道在这种情况下是否有另一种更好的可行方法来处理数千个并发请求。

这只是一个演示脚本,但实际脚本包含类似的功能:

import string
import spacy
nlp = spacy.load('en')
d = string.punctuation
d = "".join(d.translate(str.maketrans("".join(used_punct),
    " "*len("".join(used_punct)))).split())

def remove_punct(val):
    test = list(val)
    for item in test:
        if item in d:
            test[test.index(item)] = ""
        elif item in string.punctuation:
            test[test.index(item)] = " " + item + " "
    return " ".join("".join(test).split())

def get_pos_dep(val):
    doc = nlp(remove_punct(" ".join(list(map(lambda x:x[0], val)))).lower())
    tokens = []
    for token in doc:
        tokens.append((token.text, token.pos_, token.dep_))
    ref_values = "".join(list(map(lambda x:(x[1]+",")*
                 len(remove_punct(x[0]).split()), val))).split(",")[:-1]
    final = []
    for item in list(zip(tokens, ref_values)):
        if item[0][1] != "PRON":
            item_ = tuple(list(item[0]) + [item[1]])
            final.append(item_)
    return [" ".join(list(map(lambda x:x[0], final))), " ".join(list(map(lambda x:x[1], final))), 
            " ".join(list(map(lambda x:x[2], final))), ",".join(list(map(lambda x:x[3], final)))]

使用异步方法(例如夸脱(怎么样?它与 Flask 非常相似,但异步加上通过超级玉米改变枪角兽。

夸脱:

Quart是一个Python ASGI网站 微框架。它旨在提供最简单的使用方法 Web 上下文中的 asyncio 功能,尤其是对于现有的 Flask 应用程序。这是可能的,因为Quart API是Flask API的超集。https://gitlab.com/pgjones/quart

超级角牛:

Hypercorn是一个基于sans-io hyper,h11,h2和wsproto库的ASGI网络服务器,灵感来自Gunicorn。Hypercorn支持HTTP/1,HTTP/2和websockets以及ASGI 2规范。Hypercorn可以使用asyncio,uvloop或trio工人类型。https://pgjones.gitlab.io/hypercorn/

相关内容

  • 没有找到相关文章

最新更新