在桌面应用中运行嵌入式web服务器的推荐方法是什么(例如用pyqt的wsgi服务器)

7 投票
3 回答
2907 浏览
提问于 2025-04-15 23:42

这个桌面应用程序在启动时应该启动一个网络服务器,并在关闭时把它关掉。

假设只有这个桌面应用可以连接到这个网络服务器,那么最好的写法是什么呢?

网络服务器和桌面应用都是在各自的循环中运行的。那么,我应该使用线程还是多进程呢?

3 个回答

1

Sauce RC 中,我们使用了 CherryPy。因为它是纯Python写的,所以把它放进去(无论是直接放在硬盘上还是打包成zip文件)都非常简单。

2

你可以看看 BaseHTTPServer 这个包,或者更好的是看看 SimpleHTTPServer。这两个都很简单,使用起来也很方便。

6

可以使用像 CherryPy 或 paste.httpserver 这样的工具。你也可以用 wsgiref 提供的服务器,通常在本地使用还不错,但如果你在做 Ajax 的话,wsgiref 是单线程的,这可能会导致一些奇怪的结果,或者如果你做了子请求,就会出现竞争条件。不过在大多数情况下,它还是可以用的。如果你不想要一个内置的多线程服务器(CherryPy 和 paste.httpserver 都是多线程的),那么 wsgiref 可能会对你有帮助,因为所有请求都会在同一个线程中运行。

需要注意的是,如果你使用 CherryPy 或 paste.httpserver,所有请求都会自动在子线程中进行(这些包会为你处理线程的创建),而且你可能无法直接从你的网页代码中操作 GUI 代码(因为 GUI 代码通常不喜欢被线程处理)。对于这些服务器,代码会被阻塞,所以你需要在一个线程中启动服务器。Twisted 可以在你正常的 GUI 事件循环中运行,但如果这不是很重要的话,它会增加很多复杂性。

不要使用 BaseHTTPServer 或 SimpleHTTPServer,它们既傻又复杂,在所有你可能使用它们的情况下,你应该选择 wsgiref。每一种情况都是这样,因为 wsgiref 有一个合理的 API(WSGI),而这些服务器的 API 则很傻。

撰写回答