【问题标题】:How to pass a video file to worker function in Heroku (Flask)如何将视频文件传递给 Heroku(Flask)中的工作函数
【发布时间】:2020-04-08 08:00:58
【问题描述】:

上下文

我有一个网络测功机,它接收一个视频文件,目的是应用计算机视觉算法来返回分析。算法运行大约需要 10 秒。我目前的方法是用网络测功机处理它。整个过程非常快。用户不必等待超过一分钟。

什么不起作用

当然,捆绑网络测功机是个坏主意。有些用户已经超时......所以我尝试实现 redis 将工作传递给工作人员。

@application.route('/video', methods=['POST'])
@cross_origin()
def video():
    video_file = request.files['videoData']
    job = q.enqueue_call(
        func=run_analysis, args=(video_file), result_ttl=5000
    )
    return json.dumps(job.id)

但这给了我一个错误 TypeError: cannot serialize '_io.BufferedRandom' object 我明白为什么。

在我的开发环境中,我可以将视频保存到文件系统并仅传递文件路径,但这在生产中不起作用,因为 web dyno 的文件系统是短暂的,工作人员不会看到文件。

所以我正在寻找获取视频文件的最快方法。速度在这里至关重要,因为用户正在等待处理他们的视频。

我的尝试

我尝试过 S3(直接从客户端上传并在工作程序中下载),但它使整个过程变慢了。首先,上传到 S3 比上传到我的 Heroku 端点需要更长的时间。其次,我必须将它下载到工作人员,这也需要一段时间。我真的不需要保留文件,所以这是一个非常低效的工作。

【问题讨论】:

    标签: heroku flask amazon-s3 file-upload redis


    【解决方案1】:

    Heroku dynos 是完全隔离的容器,这就是为什么它们不能随心所欲地共享文件系统的原因。但是,如果您将它们托管在另一个主机上,例如 DigitalOcean 或亚马逊,您将能够立即从其他工作人员访问您由 Flask 存储的文件(或几乎立即 - 不要忘记创建临时副本 -文件,Flask 或 WSGI 应在发送响应后将其删除)。

    另一种选择是找到将视频数据(并非总是文件)“传输”给工作人员的最快方式。你可以这样做:

    • queue - 将整个文件放入队列。不推荐方法,但如果视频文件非常小,仍然可以。
    • 内存数据库 - 将文件保存到某个内存数据库(例如 Redis)。他们有很多机制可以在服务器或进程之间快速传输数据(缺点:在 Heroku 上很昂贵)
    • 数据库 - 将文件保存到通用数据库(例如 Postgresql),其功能与 Redis 相同,但它能够以更便宜的方式处理更大的数据,但速度会慢一些。
    • WebSockets 甚至 Unix-socket - 你可以拥有一个 Flask 可以连接、发送文件和返回 http-response 的 worker。那个“听众”实际上会开始任务。它可以将视频保存到文件并提供下一个工作人员的路径(但它应该始终与其他工作人员在同一个测功机上)或使用 args、“fork”、线程、子处理等直接提供数据。
      你可以从Flask-SocketIO开始。
      但请记住,您需要配置服务器到服务器的连接 - 在 webapp 和 worker 之间,应该在循环或单独的线程中列出它。不是浏览器中的 Javascript,这也可能是选项 - 启动任务并将文件直接上传到工作人员。
      P.S.没有 30 秒。 Heroku for WebSockets 的超时 :)

    【讨论】:

    • 太好了,感谢您抽出宝贵时间!只需两个快速跟进问题:(1)视频文件可以是 20-50MB。这对于像 postgres 这样的数据库来说会不会太重?,(2)你知道任何可以帮助我更好地理解你的最后一点的资源/教程吗?我不熟悉 websockets。
    • @AlexanderSoare (1) 不,对于 Postgres - 不要太重。对于 Redis 来说可能太重了。 (2)相信大家可以从Flask-SocketIO官方文档和例子入手。更新了答案,提供了两者的更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 2022-11-16
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2017-11-22
    相关资源
    最近更新 更多