- 首先说明一下我的想法及遇到的问题:
(1)我需要使用celery框架实现耗时任务与后端服务的解耦,我自己定义了一个方法类:
代码如下:
class Remote:
def __init__(self, hostname, port, username, passwd):
self.ip = hostname
self.port = port
self.username = username
self.passwd = passwd
def SShclient(self, command=None):
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(
hostname=self.ip, port=self.port, username=self.username, password=self.passwd
)
stdin, stdout, stderr = ssh_client.exec_command(command=command, get_pty=True)
if stdout:
print(stdout.read().decode('utf-8'))
print(stderr.read().decode('utf-8'))
def SFTPcClient(self):
tran = paramiko.Transport((self.ip, self.port))
tran.connect(username=self.username, password=self.passwd)
sftp = paramiko.SFTPClient.from_transport(tran)
return sftp
def upload_file(self, local_path, remote_path):
sftp = self.SFTPcClient()
remote_name = local_path.rsplit('/')
put_info = sftp.put(local_path, remote_path + remote_name[-1], confirm=True)
sftp.close()
print(put_info)
def down_file(self, remote_path):
sftp = self.SFTPcClient()
local_path = '/home/xxx/'
local_name = remote_path.rsplit('/')[-1]
sftp.get(remotepath=remote_path, localpath=local_path + local_name)
sftp.close()
- 我想将类中的比如像文件的上传及下载函数变成异步执行的形式,但是当我按照官方文档中的方法进行操作时,会提示一个 缺少一个位置参数 self的错误。
- 解决方法:
- 在
app
中的 tasks.py
文件中重新定义一个任务函数,代码如下:
@shared_task
def main():
remote = Remote(hostname='yourIP', port='yourport', username='yourname', passwd='yourpasswd')
remote.down_file(remote_path='/root/django_debug.log')
- 上面只是我简单实现的一个功能,后面的可以根据这个思路继续往下进行,我们在
tasks.py
中定义了一个函数,并且用@share_task
进行装饰,之后启动 celery
即可。
通过这个问题,我们需要重点说明一下,我们无法将一个方法类中的某个函数变成异步,celery执行的是异步的任务,所以我们需要将执行这项任务所需的所有方法以及参数,封装的一个任务函数中才可以,不可以将一个任务中的某一步变成异步执行,切记!!!!