因此,我已经能够从 Python 脚本中提取出两个非常有值(value)的特性。第一个是从命令行将 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
的东西.不过,我不太确定如何从这里取得进展。
任何帮助,即使它只是一些文档的链接也会非常有帮助。提前,我意识到我可以将其包装在一个浅 flask 应用程序中并通过 http
运行它请求,但出于 NDA 的原因,我需要通过内部 shell 命令运行的东西。
最佳答案
仅仅因为我喜欢zmq和gevent,我可能会做这样的事情:
服务器.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 之类的东西。
关于python - 将 python 守护程序公开为服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23923658/