Flask和subprocess Popen - 向多个用户发送相同的数据

时间:2017-07-27 21:44:19

标签: python flask

以下代码几乎就是我所需要的。但是当第二个用户连接,新的subprocess.Popen创建时,我只需要运行一个subprocess.Popen并将相同的数据发送给多个用户。

示例:第一个用户连接,启动subprocess.Popen,他开始从数字0开始接收结果,当第二个用户连接30秒后,他开始从第30号开始接收结果。

#!/usr/bin/env python
import os
from functools import partial
from subprocess import Popen, PIPE

from flask import Flask, Response  # $ pip install flask

file = 'test.file'
app = Flask(__name__)


@app.route('/' + file)
def stream():
    process = Popen([ "bash", "-c", "for ((i=0;i<100;i=i+1)); do echo $i; sleep 1; done" ], stdout=PIPE, bufsize=-1)
    read_chunk = partial(os.read, process.stdout.fileno(), 1024)
    return Response(iter(read_chunk, b''), mimetype='audio/mp3')

if __name__ == "__main__":
    app.run(host='0.0.0.0',threaded=True)

1 个答案:

答案 0 :(得分:1)

说实话,我不确定这是否有用。我没有非常使用subprocess模块,所以我不确定这是否是一个合适的用例。这个问题一般让我想起了烧瓶扩展。

我试图建议你使用与烧瓶扩展类似的模式......

  1. 检查资源是否存在
  2. 如果没有,请创建
  3. 返回
  4. 将其存储在Flask global上,这是扩展开发的API建议。

    编辑:通过文件名实现了您的路线,因此更改了密钥以反映

    #!/usr/bin/env python
    import os
    from functools import partial
    from subprocess import Popen, PIPE
    from flask import Flask, Response, _app_ctx_stack as stack
    
    file = 'test.file'
    app = Flask(__name__)
    
    def get_chunk(file):
        ctx = stack.top
        key = "read_chunk_%s" % file
        if ctx is not None:
            if not hasattr(ctx, key):
                process = Popen(["bash", "-c", "for ((i=0;i<100;i=i+1)); do echo $i; sleep 1; done"], 
                                stdout=PIPE, bufsize=-1)
                setattr(ctx, key, partial(os.read, process.stdout.fileno(), 1024))
            return getattr(ctx, key)
    
    
    @app.route('/' + file)
    def stream():
        read_chunk = get_chunk(file)
        return Response(iter(read_chunk, b''), mimetype='audio/mp3')
    
    if __name__ == "__main__":
        app.run(host='0.0.0.0',threaded=True)