Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >并行执行任务思考

并行执行任务思考

作者头像
LiosWong
发布于 2018-10-29 09:42:36
发布于 2018-10-29 09:42:36
52400
代码可运行
举报
文章被收录于专栏:后端沉思录后端沉思录
运行总次数:0
代码可运行

问题

这篇文章由之前的并行执行任务发展而来,如何生成task,在之前的文章中,生成task方式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Abstract Task: 
public abstract class BasicUserFilter implements Callable<UserFilterDto> {
private static final Log logger = LogFactory.getLog(BasicUserFilter.class);
@Autowired
UserService userService;
public Long companyId;
public Long userId;
@Override
public UserFilterDto call() throws Exception {
    try {
        //每个执行任务调用同一个方法,只是入参不同
        Response<Boolean> response = userService.filter(getUserId(), getCompanyId());
        if (response.isSuccess() && response.getResult()) {
            return new UserFilterDto().setCompanyId(getCompanyId()).setUserId(getUserId()).setFilterResultEnum(FilterResultEnum.TRUE);
        }
    } catch (Exception e) {
        logger.error(e.getMessage(), e);
    }
    return new UserFilterDto().setCompanyId(getCompanyId()).setUserId(getUserId()).setFilterResultEnum(FilterResultEnum.FALSE);
}
@PostConstruct
abstract void init();
// ... 篇幅关系,省略属性setter、getter方法
}
}

Task1:
public class Task1 extends BasicUserFilter{
    @Override
    public void init() {
        FilterConfigManager.register(CompanyAppIdEnum.GEI_NI_HUA.getCompanyId(),this);
    }
    @Override
    public UserFilterDto call() throws Exception {
        return super.call();
    }
}

上面生成任务类时,使用了策略模式,添加每一个任务都必须新增一个实体类,且实现BasicUserFilter或者重写自己的 call方法,有木有比较好的方法解决这种繁琐的任务类构建呢。

方案

解决切入点,就是所有的任务类都执行了相同的逻辑,且调用了入参不同的方法而已,无疑使用代理模式去动态生成任务类,思路有了,代码实现也边的简单起来。下面使用java InvocationHandler创建动态代理类.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ProxyHandler:
/**
 * @author LiosWong
 * @description
 * @date 2018/10/27 上午1:10
 */
public class ProxyHandler<T> implements InvocationHandler, Serializable {
    private static final long serialVersionUID = -6424540398559729838L;
    private final ProxyInterface<T> proxyInterface;

    public ProxyHandler(ProxyInterface<T> proxyInterface) {
        this.proxyInterface = proxyInterface;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 根据方法名,执行不同逻辑
        if ("call".equals(method.getName())) {
            return proxyInterface.call();
        }
        return null;
    }
}
ProxyInterface:为了使代理模版通用,添加接口约束
/** 
 * @author LiosWong
 * @description 可扩展代理接入点
 * @date 2018/10/27 上午1:11
 */
public interface ProxyInterface<T> extends Callable<T> {

}
ProxyFactory:代理工厂
public class ProxyFactory<T> {
private final Class<T> mapperInterface;

public ProxyFactory(Class<T> mapperInterface) {
    this.mapperInterface = mapperInterface;
}
public Class<T> getMapperInterface() {
    return mapperInterface;
}
@SuppressWarnings("unchecked")
protected T newInstance(ProxyHandler<T> mapperProxy) {
    return (T) java.lang.reflect.Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[]{mapperInterface}, mapperProxy);
}
public T newInstance(ProxyInterface proxyInterface) {
    final ProxyHandler<T> mapperProxy = new ProxyHandler<T>(proxyInterface);
    return newInstance(mapperProxy);
}
}

完成了上面的动态代理类构建,下面就是在业务代码中使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ProxyFactory proxyFactory = new ProxyFactory<Callable>(Callable.class);
        List<Callable<UserFilterDto>> callableList = new ArrayList<>();
        List<UserFilterDto> filterDtosResult = new ArrayList<>();
        // 动态生成代理类
        list.forEach(p -> {
            Callable<UserFilterDto> callable = null;
            // 复用代理模版
            switch (concurrencyType) {
                case FILTER:
                    callable = (Callable<UserFilterDto>) proxyFactory.newInstance(new ProxyFilterCallable(xjUserService, userId, p.getCompanyId()));
                    break;
                case SATISFY:
                    callable = (Callable<UserFilterDto>) proxyFactory.newInstance(new ProxySatisfyCallable(companyUserGroupService, userId, p.getCompanyId()));
                    break;
                default:
                    break;
            }
            callableList.add(callable);
        });

ProxyFilterCallable:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ProxyFilterCallable<T> implements ProxyInterface<T> {
    private static final Log logger = LogFactory.getLog(ProxyFilterCallable.class);
    private UserService userService;
    private Long userId;
    private Long companyId;

    public ProxyFilterCallable(XjUserService xjUserService, Long userId, Long companyId) {
        this.xjUserService = xjUserService;
        this.userId = userId;
        this.companyId = companyId;
    }
    @Override
    public T call() throws Exception {
        try {
            Response<Boolean> response = userService.filter(getUserId(), getCompanyId());
            if (response.isSuccess() && response.getResult()) {
                return (T) new UserFilterDto().setCompanyId(getCompanyId()).setUserId(getUserId()).setFilterResultEnum(FilterResultEnum.TRUE);
            }
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
        return (T) new UserFilterDto().setCompanyId(getCompanyId()).setUserId(getUserId()).setFilterResultEnum(FilterResultEnum.FALSE);
    }
    // ...
}

ProxySatisfyCallable:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ProxySatisfyCallable<T> implements ProxyInterface<T> {
    private static final Log logger = LogFactory.getLog(ProxyFilterCallable.class);
    private CompanyUserGroupService companyUserGroupService;
    private Long userId;
    private Long companyId;

    public ProxySatisfyCallable(CompanyUserGroupService companyUserGroupService, Long userId, Long companyId) {
        this.companyUserGroupService = companyUserGroupService;
        this.userId = userId;
        this.companyId = companyId;
    }

    @Override
    public T call() throws Exception {
        try {
            XjFilterUserResultVo xjFilterUserResultVo = companyUserGroupService.checkUserInfoIsSatisfyCompany(getUserId(), getCompanyId());
            if (Objects.nonNull(xjFilterUserResultVo) && xjFilterUserResultVo.getResult()) {
                return (T) new UserFilterDto().setCompanyId(getCompanyId()).setUserId(getUserId()).setFilterResultEnum(FilterResultEnum.TRUE);
            }
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
        return (T) new UserFilterDto().setCompanyId(getCompanyId()).setUserId(getUserId()).setFilterResultEnum(FilterResultEnum.FALSE);
    }
    // ...
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端沉思录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深度学习:神经网络优化技巧
在深度学习中,有一个“损失loss”的概念,它告诉我们:模型在训练数据中表现的“多差”。
皮大大
2025/05/09
1090
由浅入深了解 深度神经网络优化算法
在最简单的情况下,优化问题包括通过系统地从允许集合中选择输入值并计算函数值来最大化或最小化实函数。
AiCharm
2023/06/07
4550
由浅入深了解 深度神经网络优化算法
深度学习进阶:神经网络优化技术全解析
神经网络是深度学习的核心,但训练一个高效、稳定的模型并非易事。优化技术直接影响模型的收敛速度、性能和泛化能力。本文将深入探讨神经网络优化中的关键方法,包括梯度下降变种、正则化、学习率调度等,并结合Python代码展示其实战效果。如果你已经掌握神经网络基础,想进一步提升模型性能,这篇教程将是你的进阶指南。欢迎在评论区分享你的优化经验!
DevKevin
2025/03/09
2240
梯度下降优化算法综述
本文翻译自Sebastian Ruder的“An overview of gradient descent optimization algoritms”,作者首先在其博客中发表了这篇文章,其博客地址为:An overview of gradient descent optimization algoritms,之后,作者将其整理完放在了arxiv中,其地址为:An overview of gradient descent optimization algoritms,在翻译的过程中以作者发布在Arxiv
felixzhao
2018/03/14
1.4K1
梯度下降优化算法综述
深度学习中的优化算法与实现
通过这么长时间的学习,我们应该对于通过深度学习解决问题的大体流程有个宏观的概念了吧?
BBuf
2020/10/10
1.1K0
深度学习中的优化算法与实现
机器学习10:梯度优化与L正则化稀疏性
在用梯度下降法求解优化问题时,最重要的操作就是计算目标函数的梯度。对于一些比较复杂的机器学习模型,如深度神经网络,目标函数的梯度公式也非常复杂,很容易写错。因此,在实际应用中,写出计算梯度的代码之后,通常需要验证自己写的代码是否正确。
用户5473628
2019/08/08
2.2K0
深度|梯度下降优化算法综述
该文翻译自An overview of gradient descent optimization algorithms。 总所周知,梯度下降算法是机器学习中使用非常广泛的优化算法,也是众多机器学习算法中最常用的优化方法。几乎当前每一个先进的(state-of-the-art)机器学习库或者深度学习库都会包括梯度下降算法的不同变种实现。但是,它们就像一个黑盒优化器,很难得到它们优缺点的实际解释。 这篇文章旨在提供梯度下降算法中的不同变种的介绍,帮助使用者根据具体需要进行使用。 这篇文章首先介绍梯度下降算法的
智能算法
2018/04/02
7160
深度|梯度下降优化算法综述
动手学深度学习(八) 优化算法进阶
在 Section 11.4 中,我们提到,目标函数有关自变量的梯度代表了目标函数在自变量当前位置下降最快的方向。因此,梯度下降也叫作最陡下降(steepest descent)。在每次迭代中,梯度下降根据自变量当前位置,沿着当前位置的梯度更新自变量。然而,如果自变量的迭代方向仅仅取决于自变量当前位置,这可能会带来一些问题。对于noisy gradient,我们需要谨慎的选取学习率和batch size, 来控制梯度方差和收敛的结果。
致Great
2020/02/25
1.4K0
动手学深度学习(八) 优化算法进阶
斯坦福CS231n - CNN for Visual Recognition(7)-lecture6梯度检查、参数更新
  梯度检查是非常重要的一个环节,就是将解析梯度和数值计算梯度进行比较。数值计算梯度时,使用中心化公式
李智
2018/08/03
7500
斯坦福CS231n - CNN for Visual Recognition(7)-lecture6梯度检查、参数更新
深度学习与CV教程(7) | 神经网络训练技巧 (下)
本系列为 斯坦福CS231n 《深度学习与计算机视觉(Deep Learning for Computer Vision)》的全套学习笔记,对应的课程视频可以在 这里 查看。更多资料获取方式见文末。
ShowMeAI
2022/06/01
5470
深度学习与CV教程(7) | 神经网络训练技巧 (下)
神经网络优化算法综述
算法检查 gradient check sanity check other check 一阶算法 Adagrad momentum nag rmsprop 总结 二阶算法 牛顿法 拟牛顿法 参考 神
用户1147754
2018/01/02
1.3K0
神经网络优化算法综述
梯度下降优化算法概述
本文介绍了自适应学习率算法的发展历程、常用算法、以及若干优化策略。通过实际案例分析了自适应学习率算法在深度学习中的重要性,并探讨了未来研究方向。
Alan Lee
2018/01/03
2.8K0
梯度下降优化算法概述
从零开始学Pytorch(十四)之优化算法进阶
目标函数有关自变量的梯度代表了目标函数在自变量当前位置下降最快的方向。因此,梯度下降也叫作最陡下降(steepest descent)。在每次迭代中,梯度下降根据自变量当前位置,沿着当前位置的梯度更新自变量。然而,如果自变量的迭代方向仅仅取决于自变量当前位置,这可能会带来一些问题。对于noisy gradient,我们需要谨慎的选取学习率和batch size, 来控制梯度方差和收敛的结果。
墨明棋妙27
2022/09/23
6620
深度学习——优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)
在机器学习、深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论文中给出了常用优化器的比较,今天来学习一下: https://arxiv.org/pdf/1609.04747.pdf 本文将梳理: 每个算法的梯度更新规则和缺点 为了应对这个不足而提出的下一个算法 超参数的一般设定值 几种算法的效果比较 选择哪种算法 ---- 0.梯度下降法深入理解 以下为个人总结,如有错误
10JQKA
2018/05/09
8.3K0
深度学习——优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)
深度学习优化策略-从经典算法到前沿创新
今日推荐:用CompletableFuture,品怨种码生,写线上BUG,拿C+绩效
一键难忘
2024/12/03
3790
关于梯度下降优化算法的概述
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
chaibubble
2019/10/22
7630
关于梯度下降优化算法的概述
梯度下降
学习率的设定 global_step = tf.Variable(0,trainble=False) starter_learning = 0.1 # 初始学习率为0.1 # 每隔10000次学习率变为原来的0.96 learning_rate = tf.exponential_dacay(starter_learning_rate,\ global_setp,10000,0.96,staircase=True) optimizer = tf.GradientDescent(learning_rate) optimizer.minimize(...my_loss...,global_step=global_setp)
Dean0731
2020/05/11
7480
梯度下降
【PyTorch入门】 PyTorch不同优化器的比较
在 PyTorch 中,torch.optim 提供了多种优化器用于神经网络训练。每种优化器背后有不同的更新规则和机制,旨在适应不同的训练需求。以下是五种常见优化器(SGD、Momentum、AdaGrad、RMSprop、Adam)的原理、作用、优缺点及应用场景。
机器学习司猫白
2025/01/21
3060
【PyTorch入门】 PyTorch不同优化器的比较
【深度学习实验】网络优化与正则化(二):基于自适应学习率的优化算法详解:Adagrad、Adadelta、RMSprop
  目前,研究人员通过大量实践总结了一些经验方法,以在神经网络的表示能力、复杂度、学习效率和泛化能力之间取得良好的平衡,从而得到良好的网络模型。本系列文章将从网络优化和网络正则化两个方面来介绍如下方法:
Qomolangma
2024/07/30
6060
【深度学习实验】网络优化与正则化(二):基于自适应学习率的优化算法详解:Adagrad、Adadelta、RMSprop
入门 | 目标函数的经典优化算法介绍
选自3dbabove 机器之心编译 参与:乾树、刘晓坤 本文使用通俗的语言和形象的图示,介绍了随机梯度下降算法和它的三种经典变体,并提供了完整的实现代码。 GitHub 链接:https://github.com/ManuelGonzalezRivero/3dbabove 代价函数的多种优化方法 目标函数是衡量预测值和实际值的相似程度的指标。通常,我们希望得到使代价尽可能小的参数集,而这意味着你的算法性能不错。函数的最小可能代价被称为最小值。有时一个代价函数可以有多个局部极小值。幸运的是,在参数空间的维数
机器之心
2018/05/10
2K0
推荐阅读
相关推荐
深度学习:神经网络优化技巧
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验