一、python安装与下载依赖
依赖版本
tensorflow>=2.3.0 keras >= 2.4.3 numpy < 1.19.0 pandas >= 1.1.0 scikit-learn >= 0.23.2 librosa >=0.8.0 scipy==1.4.1
依赖下载
tensorflow>=2.3.0 pip3 install tensorflow-cpu==2.3.0 -i https://pypi.douban.com/simple/ keras >= 2.4.3 pip3 install keras==2.4.3 -i https://pypi.douban.com/simple/ pandas >= 1.1.0 pip3 install pandas==1.1.0 -i https://pypi.douban.com/simple/ scikit-learn >= 0.23.2 pip3 install scikit-learn==0.23.2 -i https://pypi.douban.com/simple/ librosa >=1.19.1 pip3 install librosa==0.8.0 -i https://pypi.douban.com/simple/ scipy==1.4.1 pip3 install scipy==1.4.1 -i https://pypi.douban.com/simple/
安装python3
yum -y install gcc yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel wget https://www.python.org/ftp/python/3.7.3/python-3.7.3.tgz tar -zxvf python-3.7.3.tgz mkdir /usr/local/python3 cd python-3.7.3 ./configure --prefix=/usr/local/python3 make && make install ln -sf /usr/local/python3/bin/python3.7 /usr/bin/python3 ln -sf /usr/local/python3/bin/pip3.7 /usr/bin/pip3
验证
pip3 list
pip3升级
pip3 --default-timeout=10000 install -u pip
pip3 卸载与安装
- pip3 install 包名 例如:pip3 install pandas
- pip3 uninstall 包名 例如: pip3 uninstall pandas
二、mybatis plus 乐观锁配置
import com.baomidou.mybatisplus.extension.plugins.optimisticlockerinterceptor; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.transaction.annotation.enabletransactionmanagement; /** * mybatis plus 乐观锁配置 * @author nick */ @enabletransactionmanagement @configuration public class mybatisplusconfig { /** * 乐观锁 */ @bean public optimisticlockerinterceptor optimisticlockerinterceptor() { return new optimisticlockerinterceptor(); } }
三、@scheduled定时任务升级分布式定时任务
/** * disschedule切面 */ @order(100) @aspect @slf4j public class disscheduleaspect { public static final string server_name = "servername"; private final idisscheduleservice disscheduleservice; private final string servername; public disscheduleaspect( idisscheduleservice disscheduleservice, environment environment) { preconditions.checknotnull(disscheduleservice); this.disscheduleservice = disscheduleservice; preconditions.checknotnull(environment); string servername = environment.getproperty(server_name); preconditions.checkargument(!strings.isnullorempty(servername)); this.servername = servername; } /** * 方法上有注解savelog */ @pointcut(value = "@annotation(com.citydo.xclouddesk.interceptor.annotation.disschedule)") public void disscheduleannotation() { } @around(value = "disscheduleannotation() && @annotation(disschedule)") public object disschedule(proceedingjoinpoint joinpoint, disschedule disschedule) throws throwable { preconditions.checknotnull(disschedule); // 当前时间 date curdate = timeutil.getcurdate(); // 获取name string name = disschedule.name(); if (strings.isnullorempty(name)) { // 方法名 signature signature = joinpoint.getsignature(); name = signature.getname(); } // 时间间隔 int duration = disschedule.duration(); if (duration <= 0) { log.error( "disschedule fail, duration {} is less or equal 0, name : {}", duration, name ); return null; } // 时间间隔的单位 timeunit unit = disschedule.unit().getunit(); // 转化为毫秒 long millis = unit.tomillis(duration); // 获取当前任务所属的开始时间 date taskdate = timeutil.getmillisdate(curdate, (int) millis); // 当前服务是否属于线上服务 if (!disscheduleservice.servernameisvalid(servername)) { log.info( "disschedule fail, servername is invalid, servername : {} , name : {} , taskdate : {}", servername, name, timeutil.specialformattodatestr(taskdate) ); return null; } if (!disscheduleservice.trygetlock(name, taskdate, servername)) { log.info( "distributed lock not acquired, name : {} , taskdate : {}", name, timeutil.specialformattodatestr(taskdate) ); return null; } // 执行正常的方法逻辑 return joinpoint.proceed(); } }
/** * 在方法执行之前,决定当前是否需要执行定时调度任务 * @author nick */ @target(elementtype.method) @retention(retentionpolicy.runtime) public @interface disschedule { /** * 定时调度任务的名称(默认是方法名) */ string name() default ""; /** * 任务的间隔时间 */ int duration(); /** * duration的时间单位(默认:分钟) */ disscheduleunit unit() default disscheduleunit.minutes; }
/** * 分布式定时调度服务 * @author nick */ public interface idisscheduleservice { /** * 重新加载 */ void reload(); /** * servername是否有效 */ boolean servernameisvalid(string servername); /** * 尝试获取锁 */ boolean trygetlock(string taskname, date taskdate, string servername); /** * 添加当前的servername */ void addservername(string servername); /** * 移除当前的servername */ void removeservername(string servername); }
/** * redis实现 */ @slf4j @service public class disscheduleredisserviceimpl implements idisscheduleservice { public static final string dis_schedule_server_name = "disscheduleservername"; private final iredismanager redismanager; public disscheduleredisserviceimpl(iredismanager redismanager) { preconditions.checknotnull(redismanager); this.redismanager = redismanager; } @override public void reload() { // do nothing } @override public boolean servernameisvalid(string servername) { try { return redismanager.ismember(dis_schedule_server_name, servername); } catch (exception e) { log.error( "disscheduleredisserviceimpl-servernameisvalid fail, servername : {} , exception : {}", servername, e ); } return false; } @override public boolean trygetlock(string taskname, date taskdate, string servername) { try { return redismanager.setnx( taskname + "_" + timeutil.specialformattodatestr(taskdate), servername ); } catch (exception e) { log.error( "disscheduleredisserviceimpl-trygetlock fail, taskname : {} , taskdate : {} , servername : {} , exception : {}", taskname, timeutil.specialformattodatestr(taskdate), servername, e ); } return false; } @override public void addservername(string servername) { preconditions.checkargument(!strings.isnullorempty(servername)); redismanager.sadd(dis_schedule_server_name, servername); } @override public void removeservername(string servername) { preconditions.checkargument(!strings.isnullorempty(servername)); redismanager.srem(dis_schedule_server_name, servername); } // @disschedule(name = "testschedule", duration = 1, unit = disscheduleunit.minutes) // @scheduled(cron = "0 0/1 * * * ?") // public void testschedule() { // logger.info("输出"); // } }
public interface iredismanager { /** * 向set中添加元素 */ boolean sadd(string key, string value); /** * set中是否存在value */ boolean ismember(string key, string value); /** * 移除set中的元素 */ void srem(string key, string value); /** * 设置字符串的值(如果不存在的话) */ boolean setnx(string key, string value); }
/** * 基于jedis实现的redismanager */ @service public class jedismanagerimpl implements iredismanager { @autowired private jedispoolclient jedispoolclient; /** * 返回1说明添加成功,返回0说明已经存在 * @param key * @param value * @return */ @override public boolean sadd(string key, string value) { preconditions.checkargument(!strings.isnullorempty(key)); preconditions.checkargument(!strings.isnullorempty(value)); return jedispoolclient.sadd(key, value) == 1l; } @override public boolean ismember(string key, string value) { preconditions.checkargument(!strings.isnullorempty(key)); preconditions.checkargument(!strings.isnullorempty(value)); return jedispoolclient.ismember(key, value); } @override public void srem(string key, string value) { preconditions.checkargument(!strings.isnullorempty(key)); preconditions.checkargument(!strings.isnullorempty(value)); jedispoolclient.srem(key, value); } @override public boolean setnx(string key, string value) { preconditions.checkargument(!strings.isnullorempty(key)); preconditions.checkargument(!strings.isnullorempty(value)); return jedispoolclient.setnx(key, value); } }
参考:https://github.com/death00/dis-schedule
四、multiset与hashmap、multimap关系
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论