Python Flask和subprocess Popen-向多个用户发送相同的数据
下面的代码几乎就是我需要的。但当第二个用户连接到新的subprocess.Popen时,我只需要运行一个subprocess.Popen并将相同的数据发送给多个用户 示例:第一个用户连接start subprocess.Popen,他开始接收从数字0开始的结果,当第二个用户连接30秒后,他开始接收从数字30开始的结果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
#!/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为目标,如图所示,但我不理解该语言