我在一个程序中有一个HTTP服务器,在另一个程序中有我的基本应用程序。它们都是循环,所以我不知道如何:
这些事情通常如何完成?我真的很喜欢Python解决方案,因为我的脚本是用Python编写的。
用户是否发出了一个http请求,该请求会在应用中查询某些数据并返回结果?的是
该应用收集数据并存储在某个地方吗? 应用程序和HTTP Server都使用SQLite数据库。但是,数据库可能有所不同。
答案 0 :(得分:3)
答案 1 :(得分:3)
好吧,你可以使用subprocess模块。对于交换数据,您可能只能使用Popen.stdin和Popen.stdout流。当然,您/可以/做的方式没有限制。 CORBA,DBUS,shared memory,DCOP,列表继续。但首先尝试简单的方法,在这种情况下是常规的python管道/流。
答案 2 :(得分:2)
在回答之前,我认为我们需要更多信息:
根据您实际使用它们的方式,有一些选项。套接字是一种选择,或通过文件或数据库传递信息。
[编辑] 根据您的回复,我认为有几种方法可以做到:
还有一些问题:
根据两个部分的依赖程度,最好编写一个新的应用程序来检查应用程序的数据库是否有变化(使用挂钩或轮询或其他)并将相关信息发布到http服务器自己的数据库中。这样做的好处是可以使两个部分不那么紧密耦合,这通常是一件好事。
我有一个网络服务器(Apache 2),它使用fastcgi模块与Django应用程序对话。看看the section in djangobook on fastcgi。 Apache使用套接字(或常规tcp)与后台应用程序(Django)进行通信。
[编辑2] 糟糕 - 只是发现您的网络服务器本身就是一个python进程。如果它都是python,那么你可以launch each in it's own thread并传递它们两个Queue对象,这两个对象允许两个进程以阻塞或非阻塞方式发送彼此信息。
答案 3 :(得分:1)
根据您的目的,您可以使用os.mkfifo创建命名管道,以在两个程序之间共享数据。
http://mail.python.org/pipermail/python-list/2006-August/568346.html
答案 4 :(得分:1)
也许twisted就是你要找的东西
答案 5 :(得分:0)
当我用Python编写Web应用程序时,我总是将我的Web服务器保持在与后台任务相同的过程中。我不知道您使用的是哪种Web服务器,但我个人使用CherryPy。您的应用程序可以将一堆线程作为Web服务器,但是您可以将许多其他线程作为后台任务。这样您就不需要任何带有套接字,命名管道等的复杂IPC。相反,您只需访问共享的,全局的,同步的数据结构来传递信息,而您的不同模块可以直接调用彼此的功能。
编辑:为了澄清,您可以使用threading module在与其他阻止服务器不同的线程中运行您的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,尽管它可以是任何东西)。