2016-08-11 151 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.任何建議? –