2

我在一个程序中有一个 HTTP 服务器,在另一个程序中有我的基本应用程序。它们都是循环,所以我不知道如何:

  1. 编写一个脚本来启动应用程序,然后是 HTTP 服务器;
  2. 使这些程序在运行中交换数据。

这些事情通常是怎么做的?我真的很喜欢 Python 解决方案,因为我的脚本是用 Python 编写的。

  1. 用户是否发出 http 请求来查询应用程序以获取某些数据并返回结果?是的

  2. 应用程序是否收集数据并将其存储在某个地方?该应用程序和 HTTP 服务器都使用 SQLite 数据库。但是 DB 可能不同。

4

6 回答 6

3

a) 您可以使用os.system启动应用程序:


os.system("command")

或者您可以使用subprocess模块。更多信息在这里

b) 使用套接字

于 2009-04-28T13:01:40.757 回答
3

好吧,您可能只使用subprocess模块。对于交换数据,您可能只能使用 Popen.stdin 和 Popen.stdout 流。当然,你/可以/做的方式没有限制。 CORBADBUS共享内存DCOP,不胜枚举。但首先尝试简单的方法,在这种情况下是常规的 python 管道/流。

于 2009-04-28T13:07:42.507 回答
2

在回答之前,我认为我们需要更多信息:

  1. 这里有可定义的信息管道吗?
    1. 用户是否发出 http 请求来查询应用程序以获取某些数据并返回结果?
    2. 应用程序是否收集数据并将其存储在某个地方?

有几个选项取决于您实际使用它们的方式。套接字是一个选项或通过文件或数据库传递信息。

[编辑]根据您的回复,我认为有几种方法可以做到:

  1. 如果您可以从 Web 服务器访问应用程序的数据库,则可以轻松地从那里提取您想要的信息。同样,这取决于您要交换的信息是什么。
  2. 如果您的应用程序只需要给 http 服务器一些结果,您可以将它们写入 http 服务器数据库中的结果表中。
  3. 正如其他人建议的那样,使用管道或子进程直接与后台应用程序交换数据。
  4. 使用您的应用程序可以写入的日志文件和您的 http 服务器读取的日志文件。

还有一些问题:

  1. 您在这里需要双向通信还是 http 服务器只是显示结果?
  2. 你用的是什么网络服务器?
  3. 你有哪些可用的处理语言?

根据这两个部分的依赖程度,最好编写一个新应用程序来检查应用程序的数据库是否有更改(使用挂钩或轮询或其他方式)并将相关信息发布到 http 服务器自己的数据库中。这样做的好处是使两个部分的耦合度降低,这通常是一件好事。

我有一个使用 fastcgi 模块与 Django 应用程序对话的网络服务器(Apache 2)。查看djangobook 中关于 fastcgi 的部分。Apache 使用套接字(或常规 tcp)与后台应用程序(Django)通信。

[编辑 2]糟糕——刚刚发现您的网络服务器本身就是一个 python 进程。如果都是 python,那么您可以在它自己的线程中启动每个线程并将它们传递给两个Queue对象,这允许两个进程以阻塞或非阻塞方式相互发送信息。

于 2009-04-28T13:05:31.107 回答
1

根据您想要做什么,您可以使用 os.mkfifo 创建一个命名管道以在两个程序之间共享数据。

http://mail.python.org/pipermail/python-list/2006-August/568346.html

于 2009-04-28T13:04:44.247 回答
1

也许扭曲是你要找的

于 2009-04-28T13:42:09.477 回答
0

当我用 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,尽管它可以是任何东西)。

于 2009-04-28T13:28:34.640 回答