我在一个程序中有一个 HTTP 服务器,在另一个程序中有我的基本应用程序。它们都是循环,所以我不知道如何:
- 编写一个脚本来启动应用程序,然后是 HTTP 服务器;
- 使这些程序在运行中交换数据。
这些事情通常是怎么做的?我真的很喜欢 Python 解决方案,因为我的脚本是用 Python 编写的。
用户是否发出 http 请求来查询应用程序以获取某些数据并返回结果?是的
应用程序是否收集数据并将其存储在某个地方?该应用程序和 HTTP 服务器都使用 SQLite 数据库。但是 DB 可能不同。
我在一个程序中有一个 HTTP 服务器,在另一个程序中有我的基本应用程序。它们都是循环,所以我不知道如何:
这些事情通常是怎么做的?我真的很喜欢 Python 解决方案,因为我的脚本是用 Python 编写的。
用户是否发出 http 请求来查询应用程序以获取某些数据并返回结果?是的
应用程序是否收集数据并将其存储在某个地方?该应用程序和 HTTP 服务器都使用 SQLite 数据库。但是 DB 可能不同。
好吧,您可能只使用subprocess模块。对于交换数据,您可能只能使用 Popen.stdin 和 Popen.stdout 流。当然,你/可以/做的方式没有限制。 CORBA、DBUS、共享内存、DCOP,不胜枚举。但首先尝试简单的方法,在这种情况下是常规的 python 管道/流。
在回答之前,我认为我们需要更多信息:
有几个选项取决于您实际使用它们的方式。套接字是一个选项或通过文件或数据库传递信息。
[编辑]根据您的回复,我认为有几种方法可以做到:
还有一些问题:
根据这两个部分的依赖程度,最好编写一个新应用程序来检查应用程序的数据库是否有更改(使用挂钩或轮询或其他方式)并将相关信息发布到 http 服务器自己的数据库中。这样做的好处是使两个部分的耦合度降低,这通常是一件好事。
我有一个使用 fastcgi 模块与 Django 应用程序对话的网络服务器(Apache 2)。查看djangobook 中关于 fastcgi 的部分。Apache 使用套接字(或常规 tcp)与后台应用程序(Django)通信。
[编辑 2]糟糕——刚刚发现您的网络服务器本身就是一个 python 进程。如果都是 python,那么您可以在它自己的线程中启动每个线程并将它们传递给两个Queue对象,这允许两个进程以阻塞或非阻塞方式相互发送信息。
根据您想要做什么,您可以使用 os.mkfifo 创建一个命名管道以在两个程序之间共享数据。
http://mail.python.org/pipermail/python-list/2006-August/568346.html
也许扭曲是你要找的
当我用 Python 编写 Web 应用程序时,我总是将我的 Web 服务器与我的后台任务保持在同一个进程中。我不知道您使用的是什么网络服务器,但我个人使用的是CherryPy。您的应用程序可以有一堆线程作为 Web 服务器,而您喜欢的其他线程也可以作为后台任务。这样,您就不需要任何复杂的 IPC 与套接字、命名管道等。相反,您只需访问共享的、全局的、同步的数据结构来传递信息,并且您的不同模块可以直接调用彼此的函数。
编辑:为了澄清,您可以使用线程模块在与其他阻塞服务器不同的线程中运行您的 CherryPy 服务器。例如:
def listener():
sock = get_socket_from_somewhere()
while True:
client, addr = sock.accept()
# send data back to client, etc
from threading import Thread
t1 = Thread(target=listener)
t1.setDaemon(True)
t1.start()
cherrypy.quickstart() # you'd need actual arguments here
这个例子展示了如何在与 Web 服务器相同的进程中的一个线程中拥有一个阻塞服务器(在本例中为 CherryPy,尽管它可以是任何东西)。