公开python守护进程作为服务

时间:2014-05-28 23:51:31

标签: 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脚本来守护脚本并使其在内存中运行。我现在发现自己处于一个我需要同时使用这两个功能的位置,而且我不确定从哪里开始。为清楚起见,我基本上都有以下几点:

if __name__ == "__main__":
    big_file = open(slow_loader)
    foo(big_file)

理想情况下,一旦运行,我会将整个big_file保留在内存中,并且能够通过运行类似于原始内容的foo来访问big_file方法python file.py somearg。我不确定如何从这里进步。

任何帮助,即使它只是指向某些文档的链接也会非常有帮助。提前,我意识到我可以将它包装在浅烧瓶应用程序中并通过http请求运行它,但是出于NDA的原因,我需要通过内部shell命令运行的东西。

1 个答案:

答案 0 :(得分:2)

因为我喜欢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这样的东西。