0

我已按照https://devcenter.heroku.com/articles/python-rq上的教程进行操作

假设我有一个函数可以将 PDF 文件转换为 JPG 并将它们存储在应用程序的 tmp/file/ 中,然后将其上传到 S3。

但是,由于 Heroku 上的请求超时时间为 30 秒,我无法将其放入视图中,因此我决定使用后台工作人员来执行任务。因此,我将代码移至任务中,但工作人员无法找到正确的路径。

[Errno 2] No such file or directory. 我尝试打印没有运气,但我可以在函数中打印。

我尝试调用的函数在任务中给出了一个空字符串,但在视图中给出了正确的值是sorted(os.listdir('tmp/file/')

我四处搜索并认为可能 PYTHONPATH 变量可能是错误的,但一切都通过 manage.py

我的 worker.py 看起来像这样。

import os
import redis
import sys
from rq import Worker, Queue, Connection

listen = ['high', 'default', 'low']
os.environ['DJANGO_SETTINGS_MODULE'] = 'cinnamon_rest.settings'

redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379')

conn = redis.from_url(redis_url)

if __name__ == '__main__':
    with Connection(conn):
        worker = Worker(map(Queue, listen))
        worker.work()

我的 manage.py 看起来像这样。

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cinnamon_rest.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)
4

1 回答 1

0

worker 和 web dynos 不共享文件系统;它们就像容器(我 Heroku 在幕后使用 LXC 容器,就像 Docker 一样)。存在于 git repo 中或由构建过程生成的文件将存在(因为它们被组装到用于启动容器的“slug”中),但任何动态写入的文件将仅存在于文件系统中那个特定的容器。您将需要使用外部存储机制在容器之间共享文件/blob 数据,例如https://django-storages.readthedocs.io/en/latest/

于 2016-10-26T18:04:47.553 回答