我正在关注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
事实证明我无法将套接字对象传递给分叉进程。大文件上传还有其他解决方案吗?感谢。
答案 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点的要求。