我下面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對象分叉過程。有沒有其他解決方案可以用於大文件上傳?謝謝。
有想法。謝謝。我已經重新編輯了問題2.任何建議? –