基于 prolog 数据文件的多用户 Web 应用程序
Multi user web application over prolog data files
我正在 Flask 中开发多用户 Web 应用程序。直到我使用 MySQL 作为数据源。现在,我正在添加一些需要 Prolog 作为推理引擎的功能。我的问题与方式有关,如何处理事实和规则数据。我不认为从 MySQL 数据创建每个 Web 请求 Prolog 文件是一个很好的选择,并在服务器上查阅这个新创建的文件。在添加一些事实或规则后,Prolog 数据应该以某种方式保存在服务器和 Prolog 引擎更新上。有人遇到过这个吗?这种功能的正确实现方式是什么?
那么,请问如何在多用户 Web 应用程序中保存 Prolog 数据,每个用户都可以在其中添加一些事实甚至规则。其他用户应该立即看到更改的数据。如何让它稳健和正确?
这是一个大而复杂的问题。让我们开始分解它。
在 SWI-Prolog 方面,您需要一个动态但持久的数据库。这里 library(persistency)
会为您处理。
但是,这是一个很大的问题,Flask 是一个多线程应用程序,这意味着您需要某种方式以多线程方式与 SWI-Prolog 进行通信,并且您的数据更新也需要是线程安全的。 PySWIP 无法处理这个。
对于 SWI-Prolog,为了线程安全,您需要将所有 library(persistency)
谓词包装在 with_mutex/2
中。
与 SWI-Prolog 进行多线程通信的最佳选择是通过 pengines。通过这种方式,您 运行 您的 SWI-Prolog 在其自己的服务器中并通过 HTTP 请求与其通信。 library(persistency)
谓词使用互斥锁,因此被认为是不安全的,这意味着您必须将它们标记为安全的。
有一个pip install pengines
,但是文档与开发不同步。您不需要调用 pengine.create()
,但您需要在 query = pengine.ask()
之后调用 pengine.doAsk(query)
并使用 pengine.iAmFinished(query)
完成一组查询。阅读这方面的源代码是个不错的主意。
它们可以一起破坏,而且确实有效!
我正在 Flask 中开发多用户 Web 应用程序。直到我使用 MySQL 作为数据源。现在,我正在添加一些需要 Prolog 作为推理引擎的功能。我的问题与方式有关,如何处理事实和规则数据。我不认为从 MySQL 数据创建每个 Web 请求 Prolog 文件是一个很好的选择,并在服务器上查阅这个新创建的文件。在添加一些事实或规则后,Prolog 数据应该以某种方式保存在服务器和 Prolog 引擎更新上。有人遇到过这个吗?这种功能的正确实现方式是什么?
那么,请问如何在多用户 Web 应用程序中保存 Prolog 数据,每个用户都可以在其中添加一些事实甚至规则。其他用户应该立即看到更改的数据。如何让它稳健和正确?
这是一个大而复杂的问题。让我们开始分解它。
在 SWI-Prolog 方面,您需要一个动态但持久的数据库。这里 library(persistency)
会为您处理。
但是,这是一个很大的问题,Flask 是一个多线程应用程序,这意味着您需要某种方式以多线程方式与 SWI-Prolog 进行通信,并且您的数据更新也需要是线程安全的。 PySWIP 无法处理这个。
对于 SWI-Prolog,为了线程安全,您需要将所有 library(persistency)
谓词包装在 with_mutex/2
中。
与 SWI-Prolog 进行多线程通信的最佳选择是通过 pengines。通过这种方式,您 运行 您的 SWI-Prolog 在其自己的服务器中并通过 HTTP 请求与其通信。 library(persistency)
谓词使用互斥锁,因此被认为是不安全的,这意味着您必须将它们标记为安全的。
有一个pip install pengines
,但是文档与开发不同步。您不需要调用 pengine.create()
,但您需要在 query = pengine.ask()
之后调用 pengine.doAsk(query)
并使用 pengine.iAmFinished(query)
完成一组查询。阅读这方面的源代码是个不错的主意。
它们可以一起破坏,而且确实有效!