gpt4 book ai didi

python - Flask 和子进程 Popen - 向多个用户发送相同的数据

转载 作者:太空宇宙 更新时间:2023-11-03 14:57:55 25 4
gpt4 key购买 nike

下面的代码几乎是我所需要的。但是当第二个用户连接时,创建了新的 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)

最佳答案

说实话,我不确定这是否有效。我不太使用 subprocess 模块,所以我不确定这是否是一个合适的用例。一般来说,这个问题让我想起了 flask 扩展。

我试图建议您使用与 flask 扩展类似的模式......

  1. 检查资源是否存在
  2. 如果没有,则创建它
  3. 返回

将其存储在 Flask 全局中,这是扩展开发的 API 推荐。

编辑:意识到您的路线是按文件名进行的,因此更改了键以反射(reflect)这一点

#!/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)

关于python - Flask 和子进程 Popen - 向多个用户发送相同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45361520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com