关于celery如何处理类中的方法的问题

  • 首先说明一下我的想法及遇到的问题:
    (1)我需要使用celery框架实现耗时任务与后端服务的解耦,我自己定义了一个方法类:
    代码如下:
class Remote:
    def __init__(self, hostname, port, username, passwd):
        self.ip = hostname
        self.port = port
        self.username = username
        self.passwd = passwd

    # 创建 ssh 连接,执行 sehll 命令.
    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 stdin:
        #     print(stdin.read().decode('utf-8'))
        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执行的是异步的任务,所以我们需要将执行这项任务所需的所有方法以及参数,封装的一个任务函数中才可以,不可以将一个任务中的某一步变成异步执行,切记!!!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值