我有一个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模块运行的函数中。
答案 0 :(得分:0)
仅使用锁?
from multiprocessing import Lock
prologlock = Lock()
@app.route(...)
def handle_x():
with prologlock:
return MyProlog.handle_x()