有什么方法可以使用pyswip和Flask吗?

时间:2020-07-25 13:26:07

标签: python flask prolog thread-safety swi-prolog

我有一个Python应用程序,其接口在Flask中实现,并且在后端有一个使用pyswip库的模块。当我与应用程序分开运行该模块时,该模块可以完美运行。当我搜索时,似乎pyswip不是线程安全的。 我在 consult 函数上收到此错误:

swipl_fid = PL_open_foreign_frame()
OSError: exception: access violation reading 0x00000028

我可以尝试使用另一个SWI-Prolog库,但是在我的应用程序中,我需要查阅和外部.pl文件。 我有什么办法可以使它工作?

这是我使用pyswip库的方式:

from pyswip_alt import Prolog

class My_Prolog():
    def __init__(self, query):
        self.query = query.split()
        self.query = ', '.join(self.query)
        self.query = '['+self.query + ']'
        self.documents_path = "my/path"
        self.prolog = Prolog()
        self.prolog.consult("facts.pl")
        self.prolog_results = []
        self.final_result = ''

    def process(self):
        for res in self.prolog.query("complex_phrase("+self.query+", F)."):
            result = []
            for atom in res['F']:
                result.append(atom.value)
            self.prolog_results.append(result)

    def run(self):
        self.process()
        self.final_result = ' '.join(self.final_result)
        return self.final_result

这就是我使用类的方式:

nl = My_Prolog(query)
nl_query =  nl.run()

所有这些都在Flask模块运行的函数中。

1 个答案:

答案 0 :(得分:0)

仅使用锁?

from multiprocessing import Lock

prologlock = Lock()

@app.route(...)
def handle_x():
    with prologlock:
        return MyProlog.handle_x()