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

Python Flask和subprocess Popen-向多个用户发送相同的数据,python,flask,Python,Flask,下面的代码几乎就是我需要的。但当第二个用户连接到新的subprocess.Popen时,我只需要运行一个subprocess.Popen并将相同的数据发送给多个用户 示例:第一个用户连接start subprocess.Popen,他开始接收从数字0开始的结果,当第二个用户连接30秒后,他开始接收从数字30开始的结果 #!/usr/bin/env python import os from functools import partial from subprocess import Popen

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

示例:第一个用户连接start 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)
#/usr/bin/env python
导入操作系统
从functools导入部分
从子流程导入Popen、PIPE
从烧瓶导入烧瓶,响应#$pip安装烧瓶
file='test.file'
app=烧瓶(名称)
@app.route(“/”+文件)
def stream():

process=Popen([“bash”,“-c”,“for”((i=0;i老实说,我不确定这是否有效。我不太使用
子流程
模块,所以我不确定这是否是一个合适的用例。这个问题通常会让我想起烧瓶扩展

我想建议你使用类似的模式来扩展

  • 检查资源是否存在
  • 如果没有,请创建它
  • 还它
  • 将其存储在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)
    
    !/usr/bin/env python
    导入操作系统
    从functools导入部分
    从子流程导入Popen、PIPE
    从烧瓶导入烧瓶,响应,_app_ctx_堆栈作为堆栈
    file='test.file'
    app=烧瓶(名称)
    def get_块(文件):
    ctx=stack.top
    key=“读取区块%s”%file
    如果ctx不是无:
    如果不是hasattr(ctx,键):
    
    process=Popen([“bash”,“-c”,“for”((i=0;iyou可以使用这样的进程来实现延迟加载的共享资源:我不明白,是否要使用数据库?感谢您的回复。但它没有按预期工作,其条件是“if not hasattr(ctx,key)”总是返回true,Popen总是启动。如果我理解你的观点,我认为它不会起作用。我认为我尝试了类似的方法,显然,当它创建块时,它也会删除缓冲区,当其他用户尝试获取数据时,数据不再存在。例如,一个用户的数字为0,1,4,另一个用户的数字为2,3,5.换句话说,这不是相同的数据!是的,说实话,在我写了这篇文章之后,我开始感觉到改变方法会更好地为你服务。这充其量也会很笨拙。我不太明白你到底想做什么(可能是流式MP3?)。这些是我通常不使用的python函数,老实说,我从未在flask中看到过……Mpegts使用ffmpeg进行流式传输,但检查了几个http参数和ffmpeg结果。可能有一个选项是以hls为目标,如图所示,但我不理解该语言