簡體   English   中英

Python中不同實例共享資源

[英]Sharing resources in different instances in Python

我正在開發 vosk(語音到文本轉換)庫,在 python 項目中實現。

Vosk Link : https://github.com/alphacep/vosk-api

我有這行代碼

from vosk import Model, KaldiRecognizer, SetLogLevel
model = Model("model")

model=Model("model")這一行將一個大文件加載到 memory 中,我只想加載這個 model 一次,並且每個其他實例都可以共享它。

初始化文件

class Model(object):

    def __init__(self, model_path):
        self._handle = _c.vosk_model_new(model_path.encode('utf-8'))

        if self._handle == _ffi.NULL:
            raise Exception("Failed to create a model")

    def __del__(self):
        _c.vosk_model_free(self._handle)

    def vosk_model_find_word(self, word):
        return _c.vosk_model_find_word(self._handle, word.encode('utf-8'))
..
..

Python 中的任何解決方案。 謝謝

如果“加載文件”意味着“創建一堆 python 對象”,那么你就有問題了。 Python 對象分配在進程本地的一系列 memory 池中。 Python 不允許您在共享的 memory 空間中創建其對象,因為它太復雜而無法嘗試解決 memory 分配和鏈接問題。

除了像 Linux 這樣的分叉操作系統中的進程之外,共享其父 memory 的寫時復制視圖。 這包括調用fork時存在的所有 python 對象。 子進程所做的任何更改都會創建該子進程私有的 memory 的副本。 父母和任何兄弟姐妹都看不到這些變化。

要做到這一點,您需要一個知道如何執行您想要的程序的大師。 這可能會變得復雜,具體取決於您希望它有多動態。 但是,一個簡單的例子是:

from vosk import Model, KaldiRecognizer, SetLogLevel
import multiprocessing as mp

def do_thing_1(model):
    pass
    
def do_thing_2(model):
    pass
    
def do_thing_3(model)
    pass

if __name__ == "__main__":
    assert mp.get_start_methd() == "fork", "Requires 'forking' operating system"
    model = Model("model")
    processes = []
    processes.append(mp.Process(target=do_thing_1, args=(model,)))
    processes.append(mp.Process(target=do_thing_2, args=(model,)))
    processes.append(mp.Process(target=do_thing_3, args=(model,)))
    for p in processes:
        p.start()
    for p in processes:
        p.join()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM