psy*_*ok7 8 python django celery django-celery
我需要通过ftp下载文件,更改并上传回来.我正在使用芹菜这样做,但我在尝试使用链接时遇到问题,我得到的地方:
TypeError:upload_ftp_image()只需5个参数(给定6个)
另外,我可以使用链条并确保步骤是顺序的吗?如果不是什么是另类?
res = chain(download_ftp_image.s(server, username , password, "/test_app_2/model.dae" ,"tmp/test_app_2/"), upload_ftp_image.s(server, username , password, "tmp/test_app_2/model.dae" ,"tmp/test_app_2/")).apply_async()
print res.get()
Run Code Online (Sandbox Code Playgroud)
任务:
@task()
def download_ftp_image(ftp_server, username , password , filename, directory):
try:
ftp = FTP(ftp_server)
ftp.login(username, password)
if not os.path.exists(directory):
os.makedirs(directory)
ftp.retrbinary("RETR /default_app/model.dae" , open(directory + 'model.dae', 'wb').write)
else:
ftp.retrbinary("RETR /default_app/model.dae" , open(directory + 'model.dae', 'wb').write)
ftp.quit()
except error_perm, resp:
raise download_ftp_image.retry(countdown=15)
return "SUCCESS: "
@task()
def upload_ftp_image(ftp_server, username , password , file , directory):
try:
ftp = FTP(ftp_server)
ftp.login(username, password)
new_file= file.replace(directory, "")
directory = directory.replace("tmp","")
try:
ftp.storbinary("STOR " + directory + new_file , open(file, "rb"))
except:
ftp.mkd(directory)
ftp.storbinary("STOR " + directory + new_file, open(file, "rb"))
ftp.quit()
except error_perm, resp:
raise upload_ftp_image.retry(countdown=15)
return "SUCCESS: "
Run Code Online (Sandbox Code Playgroud)
对于我的具体案例,这是一个好的还是坏的做法?:
result = download_ftp_image.apply_async((server, username , password, "/test_app_2/model.dae" ,"tmp/test_app_2/",), queue='rep_data')
result.get()
result = upload_ftp_image.apply_async((server, username , password, "tmp/test_app_2/model.dae" ,"tmp/test_app_2/",), queue='rep_data')
#result.get()
Run Code Online (Sandbox Code Playgroud)
mpa*_*paf 20
如果您不希望将前一个任务的返回值用作参数,则另一个选项是使用"immutability".
http://docs.celeryproject.org/en/latest/userguide/canvas.html#immutability
而不是将子任务定义为:
download_ftp_image.s(...) and upload_ftp_image.s(...)
Run Code Online (Sandbox Code Playgroud)
将它们定义为:
download_ftp_image.si(...) and upload_ftp_image.si(...)
Run Code Online (Sandbox Code Playgroud)
现在,您可以在链中使用通常数量的参数.
Mar*_*ers 15
链始终作为第一个参数传递先前的结果.从链文件:
链接的任务将应用其父任务的结果作为第一个参数,在上述情况下将导致
mul(4, 16)
结果为4.
您的upload_ftp_image
任务不接受这个额外的参数,因此它失败了.
你有一个很好的链接用例; 保证在第一个任务完成后调用第二个任务(否则无论如何都无法传递结果).
只需为上一个任务的结果添加一个参数:
def upload_ftp_image(download_result, ftp_server, username , password , file , directory):
Run Code Online (Sandbox Code Playgroud)
你可以使用那个结果值; 也许让它下载方法返回下载文件的路径,以便上传方法知道上传什么?
归档时间: |
|
查看次数: |
10700 次 |
最近记录: |