Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Tornado为我的Python应用程序提供一个web界面来监视它_Python_Multithreading_Daemon_Tornado - Fatal编程技术网

使用Tornado为我的Python应用程序提供一个web界面来监视它

使用Tornado为我的Python应用程序提供一个web界面来监视它,python,multithreading,daemon,tornado,Python,Multithreading,Daemon,Tornado,我有一个Python应用程序,它是后台监控的,在服务器上全天候运行。我希望能够提供一个非常简单的web界面,这样我就可以监控程序中几个变量的变化值 我正在使用Tornado,我正在启动并运行一个简单的“Hello,world”,你可以在网站上找到它。但是,只要调用了tornado.ioloop.ioloop.instance().start(),它就会进入循环,不会返回。我现有的程序(本质上)也是一个无限循环,但我想将两者结合起来 所以,我的问题是:如何构造我的程序,以便通过使用Tornado提

我有一个Python应用程序,它是后台监控的,在服务器上全天候运行。我希望能够提供一个非常简单的web界面,这样我就可以监控程序中几个变量的变化值

我正在使用Tornado,我正在启动并运行一个简单的“Hello,world”,你可以在网站上找到它。但是,只要调用了
tornado.ioloop.ioloop.instance().start()
,它就会进入循环,不会返回。我现有的程序(本质上)也是一个无限循环,但我想将两者结合起来

所以,我的问题是:如何构造我的程序,以便通过使用Tornado提供web界面来监控无限循环中的变量?

我认为最好的(阅读:最简单)方法是让你的守护程序应用程序将你想要监控的特定变量写到你的tornado应用程序可以访问的共享空间。这可以是文件、套接字、数据库或键值存储。我想到的一些想法是使用您现有的数据库(如果有)、sqlite,甚至memcached。然后,您只需让您的tornado应用程序从存储它们的任何位置读取这些值


只要运行
tornado.ioloop.ioloop.instance().start()
tornado的控制流就不会从该循环返回,这是正确的。从那时起,应用程序的控制将停留在您定义的应用程序和RequestHandler中。

另一个不太优雅的解决方案是利用yaml定期从主应用程序序列化对象,并让web应用程序读取这些对象。您甚至可以将对象转储到yaml中,以便查看这些对象的不同状态。

是否可以使用
线程
包并在其自己的线程内运行Tornado

编辑:

位于的
threading
模块文档提供了更多详细信息,但我设想如下:

import threading
t = threading.Thread(target = tornado.ioloop.IOLoop.instance().start)
t.start()

让我知道这是否有效

您可以尝试使用to作为两个进程/线程之间的通信手段。

这听起来像是我更愿意走的路线-我如何使用
线程在Tornado自己的线程内运行它呢?
?我尝试添加了一些代码;看一看,看看它是否能让你开始!如果在启动之前在线程上设置
t.daemon=True
,那么当运行守护程序的主线程退出时,线程和带有它的Tornado将关闭。即使他在线程中运行Tornado,他仍然需要找到一种在两者之间通信的方法。这意味着使用某种数据库/文件(正如Charles的解决方案所建议的那样)或黑客入侵Tornado并使用管道——在我看来,这简直是一团糟。单独运行Web服务器似乎是一个更可靠的解决方案。如果它崩溃了,它就不会让OPs应用程序随之崩溃。在我看来,他只是需要web界面作为一种可选的方式来控制他的应用程序的行为,所以这两个应用程序没有必要总是同时运行。为什么他的Tornado类不直接导入他的应用程序类并反思它们的状态呢?请记住,Python线程共享一个解释器状态。您对此不是很明确,但您的建议是他应该运行两个进程,而不是一个进程,一个进程运行他的守护程序代码,另一个运行tornado事件循环,这对我来说正确吗?如果是这样,我不确定这是一个真正伟大的解决方案;协调两个过程,使它们始终同时启动和停止可能有点麻烦。