Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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
将python守护进程作为服务公开_Python_Linux_Unix_Service_Daemon - Fatal编程技术网

将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脚本来对脚本进行后台监控并使其在

因此,我已经能够从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_文件
保存在内存中,并能够根据
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
,那么异步可能没有多大意义。