2016-08-11 75 views
1

我下面Heroku的文档中关于workers,但从来没有成功过。有一个模块util.py,将运行作为后台作业:Heroku的工人不工作

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的总是终止因超时而这样的要求),我想通过一个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 转出,我不能传递一个Socket对象分叉过程。有没有其他解决方案可以用于大文件上传?谢谢。

回答

1

的线索1是函数的名称。它不会说“统计网址中的字数”,它会显示“统计字数”,网址为“”。换句话说,它需要去获取URL所引用的页面,然后计算它上面的单词。这就是requests.get()所做的。

我不明白你在第2点问什么。

+0

有想法。谢谢。我已经重新编辑了问题2.任何建议? –