将python守护进程作为服务公开
因此,我已经能够从python脚本中提取出两个非常有价值的特性。第一个是能够从命令行将python函数作为服务运行。为了简单起见,假设python脚本采用命令行参数。大致如下:将python守护进程作为服务公开,python,linux,unix,service,daemon,Python,Linux,Unix,Service,Daemon,因此,我已经能够从python脚本中提取出两个非常有价值的特性。第一个是能够从命令行将python函数作为服务运行。为了简单起见,假设python脚本采用命令行参数。大致如下: import sys def foo(): return "%s is your last argument!" % sys.argv[-1] foo() 然后,我可以通过运行python file.py somearg全局访问它,此外,我还可以编写一个supervisord脚本来对脚本进行后台监控并使其在
import sys
def foo():
return "%s is your last argument!" % sys.argv[-1]
foo()
然后,我可以通过运行python file.py somearg
全局访问它,此外,我还可以编写一个supervisord脚本来对脚本进行后台监控并使其在内存中运行。我现在发现我自己处于一个同时需要这两个特性的位置,我真的不确定从哪里开始。为了清楚起见,我基本上有以下几点:
if __name__ == "__main__":
big_file = open(slow_loader)
foo(big_file)
理想情况下,一旦运行了这个文件,我就可以将整个big_文件
保存在内存中,并能够根据big_文件
访问foo方法,方法是运行类似于原始python file.py somearg
。不过,我真的不确定如何从这里取得进展
任何帮助,即使只是一些文档的链接,都会非常有用。提前,我意识到我可以将其包装在一个浅烧瓶应用程序中,并通过http
请求运行它,但出于保密的原因,我需要一些通过内部shell命令运行的东西。仅仅因为我喜欢zmq和gevent,我可能会这样做:
server.py
import gevent
import gevent.monkey
gevent.monkey.patch_all()
import zmq.green as zmq
import json
context = zmq.Context()
socket = context.socket(zmq.ROUTER)
socket.bind("ipc:///tmp/myapp.ipc")
def do_something(parsed):
return sum(parsed.get("values"))
def handle(msg):
data = msg[1]
parsed = json.loads(data)
total = do_something(parsed)
msg[1] = json.dumps({"response": total})
socket.send_multipart(msg)
def handle_zmq():
while True:
msg = socket.recv_multipart()
gevent.spawn(handle, msg)
if __name__ == "__main__":
handle_zmq()
然后,您的命令行工具将有一个client.py,如
import json
import zmq
request_data = {
"values": [10, 20, 30 , 40],
}
context = zmq.Context()
socket = context.socket(zmq.DEALER)
socket.connect("ipc:///tmp/myapp.ipc")
socket.send(json.dumps(request_data))
print socket.recv()
很明显,这是一个人为的例子,但你应该明白这一点。或者,您也可以使用xmlrpc或jsonrpc之类的东西来实现这一点 引入redis或memcached这样的东西是可能的吗?@dano我完全可以添加任何外部服务,但不能替换大文件。从技术上讲,我实际上无法触及文件.py
的源代码,但我有足够的自省信心,一旦有了主要解决方案,我就可以将其应用于此上下文。是的,我打算建议使用基于AMQP的工具,但ZeroMQ也可以工作。对不起,你有没有可能解释一下关于gevent.spawn
和gevent.monkey.patch\u all
bits的更多解释?gevent
是一个基于greenlet
的异步网络框架。该调用正在greenlet中运行handle
,因此它可以异步处理msg
,同时仍在侦听新请求。但请注意,它只会使I/O异步。它可能对您有用,也可能不有用,这取决于您在实现handle
时所做的工作。如果您正在做一些CPU受限的事情,您可能希望使用多处理
。如果您不希望并发请求进入server.py
,那么异步可能没有多大意义。