Heroku工作者不起作用

时间:2016-08-11 14:38:11

标签: django heroku worker

我正在关注Heroku关于workers的文档,但从未成功过。有一个模块util.py将作为后台作业运行:

util.py:

import requests

def count_words_at_url(url):
    resp = requests.get(url)
    return len(resp.text.split())

并将utils.py放入工作人员的队列:

from utils import count_words_at_url
from rq import Queue
from worker import conn

q = Queue(connection=conn)
result = q.enqueue(count_words_at_url, 'http://heroku.com')

问题1:我想知道q.enqueue(...)的工作原理。我想第一个参数(count_words_at_url是函数名,第二个参数('http://heroku.com')将用作count_words_at_url函数的参数。

如果我是正确的,为什么resp = requests.get(url)必须得到这个论点?为什么不只是return len(url.split())

编辑:

问题2:为了能够上传大文件(Heroku总是因TIMEOUT而终止这样的请求),我想将HTTP请求传递给将作为后台作业运行的函数:

urls.py

urlpatterns = [
    url(r'upload/', views.upload),
]

views.py

def upload(request):
    if request.method=='GET':
        return render(request, 'upload/upload.html')
    # POST
    q = Queue(connection=conn)
    q.enqueue(uploadFile, request)
    return render(request, 'upload/upload.html')

def uploadFile(request):
    # Upload files to Google Storage
    fileToUpload = request.FILES.get('fileToUpload')
    cloudFilename = 'uploads/' + fileToUpload.name
    conn = boto.connect_gs(gs_access_key_id=GS_ACCESS_KEY,
                           gs_secret_access_key=GS_SECRET_KEY)
    bucket = conn.get_bucket(GS_BUCKET_NAME)
    fpic = boto.gs.key.Key(bucket)
    fpic.key = cloudFilename
    # Public read:
    fpic.set_contents_from_file(fileToUpload, policy='public-read')

upload.html

...
<form method=post action="/upload/" enctype=multipart/form-data>
  {% csrf_token %}
  <input type=file name=fileToUpload><br><br>
  <input type=submit value=Upload>
</form>
...

我收到了错误消息:Cannot serialize socket object 事实证明我无法将套接字对象传递给分叉进程。大文件上传还有其他解决方案吗?感谢。

1 个答案:

答案 0 :(得分:1)

1的线索在函数的名称中。它没有说“在URL中计算单词”,它说“在 URL处计算单词”。换句话说,它需要去获取URL引用的页面,然后计算其上的单词。这就是np.dstack((u.real, u.imag))[0] #Out[210]: #array([[ 1., 2.], # [ 2., 4.], # [ 3., 6.], # [ 4., 8.]]) 所做的。

我不明白你在第2点的要求。