thread - python flask 如何用多线程执行ssh并拷贝文件?

查看:171
本文介绍了thread - python flask 如何用多线程执行ssh并拷贝文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

因为不知如何简化问题,这里就直接贴问题与代码了:

目前在做一个CMS系统,可以在线编辑一个表单,表单会生成一个JSON数据并保存到数据库中,当我点击发布的时候,这个JSON数据会先写入到本地文件,并通过SSH登录到几台服务器中,然后把这个文件拷贝到各个服务器的一个路径下。

目前存在的问题是:当一个用户点击发布的时候,执行时间比较长,因为要登录好几个服务器,这个时候其他人点击的时候要等待这个逻辑处理完才会继续处理。

不知道大家有什么优化方法,我能想到的是多线程,比如整个逻辑放到一个线程里面去做,或者发布时,向每个服务器发布放到不同线程里?

另外,因为是python新手,不清楚应该在哪里创建线程,在API层?还是service层?

下面是简化的代码流程:

首先是API层面,调用service层的publish_detail方法:

# api.py
@bp.route('/activity/publish', methods=['POST'])
def detail_publish():
    detail_service = DetailService()
    activity_id = int(request.form['activity_id'])
    result = detail_service.publish_detail( activity_id )
    return jsonify_with_data('')

然后转到service,精简过程如下:

class DetailService( object ):

    def publish_detail( id ):
        # 获取数据详情
        detail = DetailModel.query.filter_by( id = id ).one()
        # 服务器信息
        servers = ['192.168.10.20', '192.168.10.21', '192.168.10.22']
        root_path = '/home/work/cms_data'
        # 将数据写入到本地文件
        save_res = self.__save_json_to_file( activity_id )
        pub_path, file_name, file_path = save_res
        # 执行发布流程
        process_res = self.__send_file_to_server( servers, root_path, pub_path, file_name, file_path )
        return True

最后是发布流程,过程继续简化一下:

# 发布流程
def __send_file_to_server( self, servers, root_path, pub_path, file_name, file_path ):
    # 循环发布
    for host in servers:
        # 1、ssh登录
        login_res = ssh_client.connect( host )
        # 2、创建文件夹
        mkdir_res = ssh_client.do('mkdir -p' + ' ' + target_path)
        # 3、scp拷贝文件到服务器
        send_res = ssh_client.send_to( file_path, target_path + file_name )
        # 4、远程文件备份
        cp_res = ssh_client.do('cp' + ' ' + target_path + target_file_name + ' ' + target_backup_path + file_name)
        # 5、文件重命名
        mv_res = ssh_client.do('mv' + ' ' + target_path + file_name + ' ' + target_path + target_file_name )
        # 6、关闭链接
        ssh_client.close()
        # 7、记录发布成功的机器
        sended_server_arr.append( server )
    # 删除本地文件
    os.remove( file_path )
    return True

解决方案

这类场景是ansible的强项

这篇关于thread - python flask 如何用多线程执行ssh并拷贝文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆