IO密集型 和 CPU密集型 任务的特点不同,因此针对不同类型的任务,选择不同类型的线程池可以获得更好的性能表现。
IO密集型任务的特点是需要频繁读写磁盘、网络或者其他IO资源,执行时间长,CPU占用率较低。
对于这类任务,线程的执行时间主要取决于IO操作的速度,而非CPU的执行能力。
因此,线程池的线程数应该设置较大,以便充分利用IO资源。
通常建议使用CachedThreadPool线程池或者FixedThreadPool线程池来处理IO密集型任务。
CPU密集型任务的特点是需要进行大量的计算,执行时间长,CPU占用率较高。
对于这类任务,线程的执行时间主要取决于CPU的执行能力。
因此,线程池的线程数应该设置较小,以充分利用CPU的计算能力,避免过多的线程切换和上下文切换导致的性能损失。
通常建议使用FixedThreadPool线程池或者SingleThreadPool线程池来处理CPU密集型任务。
总之,选择恰当的线程池类型可以充分发挥不同类型任务的性能,提高程序效率和响应速度。
对于异步线程池,通常建议使用IO密集型线程池。
异步任务通常是网络IO或磁盘IO等操作,这些操作的执行时间相对于CPU计算的执行时间要长得多。
使用IO密集型线程池可以更好地利用IO资源,提高多个异步任务的执行效率和吞吐量,
同时避免由于过多的线程切换和上下文切换导致的性能损失。
很多任务——》线程池创建核心线程——》任务超过最大线程——》把任务放入队列中等待执行——》队列中放满了——》进入处理策略
当线程池中的线程数量为 corePoolSize核心线程数 时,即使这些线程处于空闲状态,也不会销毁(除非设置 allowCoreThreadTimeOut=true)。
// -> 核心线程,也就是正在处理中的任务
// -> 虽然 CPU 核心数可以作为线程池中线程数量的参考指标,但最终线程数量还需要根据具体情况进行设置和调整。
// -> 如果同时运行的线程数量超过 CPU 核心数,就会发生--线程上下文切换--,导致额外的开销和性能下降。所以线程不能创建得过多
线程池中允许的线程数量的最大值。
// -> 当线程数 = maxPoolSize最大线程数时,还有新任务,就会放进队列中等待执行 ↓↓↓
当核心线程数达到最大时,新任务会放在队列中排队等待执行
// -> 根据业务配置,如果队列长度过大,可能会导致系统内存资源占用过高,最终导致 OOM,需要注意控制
// -> 如果需要执行的任务装满了队列,就会走拒绝策略 ↓↓↓
(官方提供4种,也可以自定义):因达到线程边界和任务队列满时,针对新任务的处理方法。
// -> AbortPolicy:直接丢弃任务并抛出 RejectedExecutionException 异常。(默认策略)
// -> DiscardPolicy:直接丢弃掉,不会抛出异常
// -> DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
// -> CallerRunsPolicy:交给主线程(调用线程)去执行
(默认60s):设置当前线程池中空闲线程的存活时间,即线程池中的线程如果有一段时间没有任务可执行,则会被回收掉。
// -> 当线程池中的线程数大于 corePoolSize 时,多余的空闲线程将在销毁之前等待新任务的最长时间。
// -> 如果一个线程在空闲时间超过了 keepAliveSeconds,且当前线程池中线程数量大于 corePoolSize,则该线程将会被回收;
// -> 核心线程会一直存活,除非线程池被关闭 或 设置下面的参数
// -> 如果 AllowCoreThreadTimeout设置为true,核心线程也会被回收,直到线程池中的线程数降为 0。
// 但如果线程池中有任务在执行,那么空闲线程就会一直保持存活状态,直到任务执行完毕。
// -> 该方法的使用可以将线程池的空闲线程回收,以减少资源占用,同时也能保证线程池中始终有可用的线程来执行任务,提高线程池的效率。
为 true 时,空闲的核心线程会在 keepAliveTime 时间后被回收,并且在后续任务到来时需要重新创建线程来执行任务。
// 为 false 时,线程池中的核心线程不会被回收,即使它们处于空闲状态一段时间。
// -> 在线程池创建时,就会预先创建核心线程数的线程,这些线程将一直存在,除非线程池被关闭或重新配置。
指等待所有任务执行完毕后线程池的最长时间。300秒 = 5分钟
// -> 当所有任务执行完毕后,线程池会等待一段时间(即等待时间),来确保所有任务都已经完成。
// -> 如果在等待时间内所有任务仍未完成,则线程池会强制停止,以确保任务不会无限制地执行下去。
// -> 可以确保所有任务都执行完毕后才关闭线程池,避免任务被丢弃,同时也确保线程池可以正常结束,释放资源。
// -> 为 true 时,线程池在关闭时会等待所有任务都执行完成后再关闭
// -> 为 false 时,线程池会直接关闭,未执行完成的任务将被丢弃。
// 9线程前缀名称
executor.setThreadNamePrefix("myIo-Th-Pool-");
// 初始化
executor.initialize();
①线程数量:N = 计算机cpu数量
* IO密级 :2 * N
* CPU密级:1 + N
②队列长度:
配置线程池选择:ThreadPoolTaskExecutor(Spring项目推荐),还是选择ThreadPoolExecutor?
ThreadPoolTaskExecutor 是 Spring 框架中对 Java 自带的线程池 ThreadPoolExecutor 进行了封装和扩展,并增加了一些优化和功能。通常来说,如果你使用 Spring 框架,需要使用线程池,那么建议使用 ThreadPoolTaskExecutor。 ThreadPoolTaskExecutor 提供了更多的配置选项,例如线程池的最大线程数、核心线程数、缓冲队列大小、线程命名前缀、线程池饱和策略等等,同时可以方便地集成到 Spring 应用中。另外,ThreadPoolTaskExecutor 还能够支持异步执行任务,使用方便。 相比之下,ThreadPoolExecutor 是 Java 自带的线程池实现类,提供了基本的线程池功能,但没有 ThreadPoolTaskExecutor 提供的更多配置选项和功能。如果你不使用 Spring 框架,或者使用 Spring 框架但不需要使用其提供的线程池实现,那么可以考虑使用 ThreadPoolExecutor。
综上所述,选择使用 ThreadPoolTaskExecutor 还是 ThreadPoolExecutor 取决于具体的业务需求和技术栈,可以根据实际情况进行选择。
int N = Runtime.getRuntime().availableProcessors()
package com.cc.md.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
/** IO型的线程池
* <li>IO密集型配置线程数经验值是:2N (CPU核数*2)</li>
* <li>异步线程池:建议用io密集型:</li>
* 对于异步线程池,通常建议使用IO密集型线程池。
* 异步任务通常是网络IO或磁盘IO等操作,这些操作的执行时间相对于CPU计算的执行时间要长得多。
* 使用IO密集型线程池可以更好地利用IO资源,提高多个异步任务的执行效率和吞吐量,
* 同时避免由于过多的线程切换和上下文切换导致的性能损失。
* @author CC
* @since 2023/5/23 0023
*/
@Configuration
@EnableAsync
public class IoThreadPool {
/** 线程数量
* CUP数量:N = Runtime.getRuntime().availableProcessors()
* IO密级:2 * N
* CPU密级:1 + N
*/
public static final int THREAD_SIZE = 2 * (Runtime.getRuntime().availableProcessors());
/**
* 队列大小
*/
public static final int QUEUE_SIZE = 1000;
@Bean(name = "myIoThreadPool")
public ThreadPoolTaskExecutor threadPoolExecutor(){
//配置线程池选择:ThreadPoolTaskExecutor,还是选择ThreadPoolExecutor好些?
// -> ThreadPoolTaskExecutor 是 Spring 框架中对 Java 自带的线程池 ThreadPoolExecutor 进行了封装和扩展,
// 并增加了一些优化和功能。通常来说,如果你使用 Spring 框架,需要使用线程池,那么建议使用 ThreadPoolTaskExecutor。
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 1核心线程数:当线程池中的线程数量为 corePoolSize 时,即使这些线程处于空闲状态,也不会销毁(除非设置 allowCoreThreadTimeOut=true)。
// -> 核心线程,也就是正在处理中的任务
// -> 虽然 CPU 核心数可以作为线程池中线程数量的参考指标,但最终线程数量还需要根据具体情况进行设置和调整。
// -> 如果同时运行的线程数量超过 CPU 核心数,就会发生--线程上下文切换--,导致额外的开销和性能下降。所以线程不能创建得过多
executor.setCorePoolSize(THREAD_SIZE);
// 2最大线程数:线程池中允许的线程数量的最大值。
// -> 当线程数 = maxPoolSize最大线程数时,还有新任务,就会放进队列中等待执行 ↓↓↓
executor.setMaxPoolSize(THREAD_SIZE);
// 3队列长度:当核心线程数达到最大时,新任务会放在队列中排队等待执行
// -> 根据业务配置,如果队列长度过大,可能会导致系统内存资源占用过高,最终导致 OOM,需要注意控制
// -> 如果需要执行的任务装满了队列,就会走拒绝策略 ↓↓↓
executor.setQueueCapacity(QUEUE_SIZE);
// 4拒绝策略(官方提供4种,也可以自定义):因达到线程边界和任务队列满时,针对新任务的处理方法。
// -> AbortPolicy:直接丢弃任务并抛出 RejectedExecutionException 异常。(默认策略)
// -> DiscardPolicy:直接丢弃掉,不会抛出异常
// -> DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
// -> CallerRunsPolicy:交给主线程(调用线程)去执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
// 5空闲线程存活时间(默认60s):设置当前线程池中空闲线程的存活时间,即线程池中的线程如果有一段时间没有任务可执行,则会被回收掉。
// -> 当线程池中的线程数大于 corePoolSize 时,多余的空闲线程将在销毁之前等待新任务的最长时间。
// -> 如果一个线程在空闲时间超过了 keepAliveSeconds,且当前线程池中线程数量大于 corePoolSize,则该线程将会被回收;
// -> 核心线程会一直存活,除非线程池被关闭 或 设置下面的参数
// -> 如果 AllowCoreThreadTimeout设置为true,核心线程也会被回收,直到线程池中的线程数降为 0。
// 但如果线程池中有任务在执行,那么空闲线程就会一直保持存活状态,直到任务执行完毕。
// -> 该方法的使用可以将线程池的空闲线程回收,以减少资源占用,同时也能保证线程池中始终有可用的线程来执行任务,提高线程池的效率。
executor.setKeepAliveSeconds(60);
//6是否禁止线程池自动终止空闲的核心线程。
// 为 true 时,空闲的核心线程会在 keepAliveTime 时间后被回收,并且在后续任务到来时需要重新创建线程来执行任务。
// 为 false 时,线程池中的核心线程不会被回收,即使它们处于空闲状态一段时间。
// -> 在线程池创建时,就会预先创建核心线程数的线程,这些线程将一直存在,除非线程池被关闭或重新配置。
executor.setAllowCoreThreadTimeOut(true);
// 7当前线程池的等待时间:指等待所有任务执行完毕后线程池的最长时间。300秒 = 5分钟
// -> 当所有任务执行完毕后,线程池会等待一段时间(即等待时间),来确保所有任务都已经完成。
// -> 如果在等待时间内所有任务仍未完成,则线程池会强制停止,以确保任务不会无限制地执行下去。
executor.setAwaitTerminationSeconds(300);
// 8当前线程池是否在关闭时等待所有任务执行完成
// -> 可以确保所有任务都执行完毕后才关闭线程池,避免任务被丢弃,同时也确保线程池可以正常结束,释放资源。
// -> 为 true 时,线程池在关闭时会等待所有任务都执行完成后再关闭
// -> 为 false 时,线程池会直接关闭,未执行完成的任务将被丢弃。
executor.setWaitForTasksToCompleteOnShutdown(true);
// 9线程前缀名称
executor.setThreadNamePrefix("myIo-Th-Pool-");
// 初始化
executor.initialize();
return executor;
}
}
package com.cc.md.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
/** CPU型的线程池
* @author CC
* @since 2023/5/23 0023
*/
@Configuration
public class CpuThreadPool {
/** 线程数量
* CUP数量:N = Runtime.getRuntime().availableProcessors()
* IO密级:2 * N
* CPU密级:1 + N
*/
public static final int THREAD_SIZE = 1 + (Runtime.getRuntime().availableProcessors());
/**
* 队列大小
*/
public static final int QUEUE_SIZE = 1000;
@Bean(name = "myCpuThreadPool")
public ThreadPoolTaskExecutor threadPoolExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(THREAD_SIZE);
executor.setMaxPoolSize(THREAD_SIZE);
executor.setQueueCapacity(QUEUE_SIZE);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
executor.setKeepAliveSeconds(60);
executor.setAllowCoreThreadTimeOut(true);
executor.setAwaitTerminationSeconds(300);
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setThreadNamePrefix("myCpu-T-Pool-");
executor.initialize();
return executor;
}
}
http://zhuanlan.zhihu.com/p/112527671
http://blog.csdn.net/shang_0122/article/details/120777113
http://blog.csdn.net/zhuimeng_by/article/details/107891268
http://blog.csdn.net/qq_25720801/article/details/129559164
http://blog.csdn.net/riemann_/article/details/104704197
大家好,又见面了,我是你们的朋友全栈君。平日经常会分析shotgun宏基因组的数据,我们的pipeline使用MetaPhlAn,Kraken等profiler。这种数据经常会产生一个表格,如下download.file("https://bitbucket.org/biobakery/biobakery/raw/tip/demos/biobakery_demos/data/metaphlan2/output/SRS014459-Stool_profile.txt",'SRS014459-Stool_profile.txt') knitr::kable(head(read.table('SRS014459-Stool_profile.txt')))复制V1V2k__Bacteria100.00000kBacteria|pFirmicutes64.91753kBacteria|pBacteroidetes35.08247kBacteria|pFirmicutes|c__Clostridia64.91753kBacteria|pB
现在我们使用容器非常频繁,偶尔有一些需求需要更改容器镜像中的一些行为,也许是一个很小的变化,一般我们能想到的就是重新构建镜像,但是这个我们就需要重新构建发布镜像了,除了构建镜像这种方式之外其实还有其他方式可以来实现这个需求。初始化容器InitContainers是为了给Pod中定义的主容器提供附加功能的。它们在主容器之前执行,可以使用不同的容器镜像,如果出现任何故障,它们将阻止主容器的启动,所有的日志都可以很容易查看到,故障排除也相当简单,它们就像在Pod中定义的任何其他容器一样。这种方法在数据库等服务中比较常用,可以根据配置参数对它们进行初始化和配置。 下面的例子使用一个emptyDir来存储由初始化容器初始化的数据。在这个示例,它只是一个简单的echo命令,在实际的生产环境中,可能是一个脚本,做一些更复杂的事情。apiVersion:apps/v1 kind:Deployment metadata: labels: app:nginx name:nginx-init spec: selector: matchLabels: app:nginx template: metadata:
1.kubectl命令概述kubectl作为客户端CLI工具,可以让用户通过命令行对Kubernetes集群进行操作。在实际工作中熟练的使用这些命令去定位K8s集群问题时是我们爱不释手的好伴侣,来和我们相互认识下吧。2.kubectl用法概述2.1.kubectl命令行语法kubectl[command][Type][NAME][flas] 复制command:子命令,用于操作Kubernetes集群资源对象的命令,例如create、delete、describe、get、apply等。TYPE:资源对象的类型,区分大小写,能以单数、复数或者简写形式表示。NAME:资源对象的名称,区分大小写。如果不指定名称,系统则将返回属于TYPE的全部对象的列表,例如$kubectlgetpods将返回所有Pod的列表。flags:kubectl子命令的可选参数,例如使用“-s”指定APIServer的URL地址而不用默认值。2.2.kubectl可操作资源对象及其缩写资源对象类型缩写clusterscomponentstatusescsconfigmapscmdaemonsetsdsdeploym
小闫辛苦码了3464个字 文章可能占用您9分钟 欢迎关注「全栈技术精选」今日分享小闫同学pythonnote.cn查看:13144回复:541 Youarenevertoooldtosetanothergoalortodreamanewdream.——LesBrown受疫情影响,让互联网的寒冬更加寒冷,金三银四也凄凄惨惨戚戚。但在这几个月小闫发现,虽然初中级工程师岗位变少,但是高级工程师岗位却依然火爆,丝毫不受影响。让小闫不经想起大四实习时,总经理曾说「社会缺少的并不是人,而是人才。如何提升自己的核心竞争力才是破局之道,强者从不受寒冬影响」当然原话已经记不清,大概就是这么个意思,你懂的~更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』言归正传,今天为大家再带来一些面试题,祝大家事随人愿。前情回顾新鲜出炉面试题(一) 新鲜出炉面试题(二) 面试题1.通过装饰器装饰的函数如何不改变其自身相关信息答:可以使用模块functools中的wraps装饰器来装饰自定义装饰器的内函数。(有点绕口,下面查看示例)正常情况下被装饰的函数,虽然可以使用原函数名进行调用,但实际上此时的函
文章说明:文章为山丘安全攻防实验室成员:O8原创 文章仅用于攻防技术学习,请勿用于非法用途 靶机环境 靶机地址:https://github.com/c0ny1/xxe-lab 搭建平台:VM、windows7、xampp 靶机IP:192.168.0.133复制 搭建说明:安装xampp后,htdocs目录放入靶机项目,然后开启apache、mysql访问即可 访问http://192.168.0.133:8081/php_xxe/(注意我这里是改了端口的) 攻击机环境 IP:192.168.0.165 操作系统:windows10 本次实验用到的工具:BurpSite、tomcat7、ngrok复制 有回显漏洞利用 攻击流程 实战 访问http://192.168.0.133:8081/php_xxe/随意输入帐户名密码进行抓包 头部信息:Accept:application/xml,text/xml,*/*; 尝试解析xxe POC: <?xmlversion="1.0"encoding="utf-8"?> <!DOCTY
摘要作为开发者,我们一直使用Maven来作为版本依赖管理工具,不过我们经常会遇到依赖冲突等问题,我们这边文章就来明确一下Maven是如何管理依赖与版本的。Maven版本结构Maven的版本结构使用如下格式:MajorVersion[.MinorVersion[.IncrementalVersion]][-Qualifier[-BuildNumber]] MajorVersion,MinorVersion,IncrementalVersion和BuildNumber都需要是数字,Qualifier是一个字符串。如果你的版本格式不符合这个要求,Maven会将整个版本看成一个Qualifier字符串版本号也隐含了兼容性MajorVersion:修改是非向后兼容的,使用新版本以为要做重大改动 MinorVersion:修改是向后兼容的,一般表示引入了新功能 IncrementalVersion:修改是向后兼容的,一般用于bug修复 Maven依赖的选择策略假设有一个项目P,它有如下的依赖图:那我们在构建的时候,哪些依赖会包含在构建中呢?这就涉及到Maven的依赖选择策略,Maven有两条依赖选
机器学习算法被认为能够通过学习数据来弄清楚如何执行重要任务。这意味着数据量越大,这些算法就可以解决更加复杂的问题。然而,开发成功的机器学习应用程序需要一定的“民间技巧”,这在教科书或机器学习入门课程中很难找到。PedroDomingos教授的一篇很好的研究论文,该论文汇集了机器学习研究人员和从业者的经验教训。https://homes.cs.washington.edu/~pedrod/要避免的陷阱,要关注的重要问题以及一些常见问题的答案。准备好去了解了吗?1.学习=表示+评估+优化你有一个应用程序,你认为机器学习可能是一个很好的选择。现在,在机器学习领域,每年都会有大量的机器学习算法可供选择,有数百种机器学习算法问世。应该使用哪一个?在这个巨大的空间中不迷失的关键是要明白所有机器学习算法的都由三个核心要素组成:表示:输入数据,即要使用的特征,学习器和分类器必须以计算机可以理解的语言表示。学习器可以学习的分类器集称为学习器的假设空间。如果分类器不在假设空间中,则无法进行学习。澄清说明:分类器与学习器的含义是什么?假设你有训练数据,并使用你构建另一个程序(模型)的程序处理这些数据,例如决
偶尔有群里的朋友在问duilib的List拖动列表头时内容大小如何跟随变化。我这边用新版的duilib代码测试是没有问题。duilib官方代码仓库https://github.com/duilib/duilib个人的修改的代码的仓库:https://github.com/juhuaguai/duilib下面是一个xml示例,用duilibpreview工具预览就直接能够测试拖动。动态添加list的Item也一样,就不给出示例了(new出ListHBoxElement,add到list上;new出Control,add到ListHBoxElement上)。<?xmlversion="1.0"encoding="utf-8"?> <Windowsize="800,320"caption="0,0,0,20"roundcorner="3,3"> <Fontshared="true"id="0"name="微软雅黑&
所有JS程序猿(甚至不止JS)都知道,数组(Array)是有length的,通过length属性,可以很方便的获取数组的长度。可以说,只要使用到了数组,就必会使用到其length属性。而Object对象是没有length属性或方法的,它确实没有存在的必要,因为人们只会在乎该对象能提供什么样的方法,而没有必要知道它到底有多少方法。的确,这确实不是一个普遍性的需求,因此ECMAScript中也不会为自己增加额外的负担。我之前一直没有考虑过这个问题,我们通过CGI获取数据,对于一条一条的数据,后台将其做成数组并以json返回。如下所示:try{callback({ data:[{a:1},{a:2}] }); }catch(e){}复制这是非常合理的,因为我在前端可以用length得到数据的长度,并逐条将其插入表格,或者是通过其他的方式表现出来。但是你永远也不能用一成不变的思维方式来解决所有问题。某天写后台接口的同事决定换一种数据格式,改用object来表示数据,并为每个数据添加一个索引,如下所示:1try{callback({ 2data:{1:{a:1},2:{a:2}} 3}); 4}
官网:宝塔面板安装要求:内存:512M以上,推荐768M以上(纯面板约占系统60M内存) 硬盘:300M以上可用硬盘空间(纯面板约占20M磁盘空间) 系统:CentOS7.1+(Ubuntu16.04+.、Debian9.0+),确保是干净的操作系统,没有安装过其它环境带的Apache/Nginx/php/MySQL/pgsql/gitlab/java(已有环境不可安装) 架构:x86_64(主流服务器均是此架构),ARM不完整兼容(面板环境安装慢,部分软件可能安装不上)宝塔Linux面板7.5.1版本是基于Centos/Debian/Ubuntu开发的,为了最好的兼容性,请使用以上系统 系统兼容性顺序:Centos7.x>Debian10>Ubuntu20.04>Cenots8.x>Ubuntu18.04>其它系统 提示:Centos官方已宣布在2020年停止对Centos6的维护更新,各大软件开发商也逐渐停止对Centos6的兼容,新服务器不建议使用Centos6Centos安装命令:yuminstall-ywget&&wget-Oin
在react里面使用svg 一、在create-react-app创建的项目中 方式1、 importlogofrom'./logo.svg'; <imgsrc={logo}/>复制 缺点在于不能在修改颜色,这里其实就是直接用img加载了svg文件 方式2、 import{ReactComponentasComLogo}from'./logo.svg'; <ComLogo/>复制 这里可以看见,实际上就是渲染了一个SVG,自定义的程度会很高。不过有版本需要: react-scripts 版本要大于@2.0.0 react 版本大于@16.3.0 具体可以参考官方文档 二、自己从零开始配置的webpack项目 如果使用上面的第二种方式引入,发现竟然是undefined,进过研究发现需要一些配置。 注意1、typescript项目需要在项目根目录 加一个 custom.d.ts 文件声明。 写入: decla
对于第一幅图来说,它侧重展示傅里叶变换的本质之一:叠加性,每个圆代表一个谐波分量。第二幅图直观的表示了一个周期信号在时域与频域的分解。 周期信号的三角函数表示 周期信号是每隔一定时间间隔,按相同规律无始无终重复变化的信号。任何周期函数在满足狄利克雷条件下(连续或只有有限个间断点,且都是第一类间断点;只有有限个极值点),都可以展开成一组正交函数的无穷级数之和。使用三角函数集的周期函数展开就是傅里叶级数。对于周期为T的信号f(t),可以用三角函数集的线性组合来表示,即 $$f(t)=a_0+\sum_{n=1}^{\infty}(a_n\cosn\omegat+b_n\sinn\omegat)$$ 式中$\omega=\frac{2\pi}{T}$是周期信号的角频率,也成基波频率,$n\omega$称为n次谐波频率;$a_0$为信号的直流分量,$a_n$和$b_n$分别是余弦分量和正弦分量幅度。根据级数理论,傅里叶系数$a_0$、$a_n$、$b_n$的计算公式为: $$\left\{\begin{matrix}a_0=\frac{1}{T}\int_{\frac{-T}
时间模块 time模块 和时间有关系的我们就要用到时间模块。在使用模块之前,应该首先导入这个模块。importtime 表示时间的三种方式 在Python中,通常有这三种方式来表示时间:时间戳、元组(struct_time)、格式化的时间字符串: (1)时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。 %y两位数的年份表示(00-99) %Y四位数的年份表示(000-9999) %m月份(01-12) %d月内中的一天(0-31) %H24小时制小时数(0-23) %I12小时制小时数(01-12) %M分钟数(00=59) %S秒(00-59) %a本地简化星期名称 %A本地完整星期名称 %b本地简化的月份名称 %B本地完整的月份名称 %c本地相应的日期表示和时间表示 %j年内的一天(001-366) %p本地A.M.或P.M.的等价符 %U一年中的星期数(00-53)星期天为星期的开始 %w星期(0-6),星期天为星期的开始 %W一年中的星期
受限于当时的基础设施,只能做到这样的程度: C#Protobuf如何做到0分配内存的序列化 但是Protobuf3.13开始提供对Span的支持,就意味着可以真正做到0分配内存,对GC非常友好: Add ParseFrom(ReadOnlySequence<byte>) methodtoenableGCfriendlyparsingwithreducedallocationsandbuffercopies.(#7351) Addsupportforserializationdirectlytoa IBufferWriter<byte> ortoa Span<byte> toenableGCfriendlyserialization.ThenewAPIisavailableasextensionmethodsonthe IMessage type.(#7576) Protobuf3.14也修改了ByteString: annotateByteString.C
CLIP:LearningTransferableVisualModelsFromNaturalLanguageSupervision 2021-11-25 21:29:02 Paper: https://arxiv.org/pdf/2103.00020.pdf Code: https://github.com/OpenAI/CLIP 2.Model: 2.1数据集:关于数据集部分,作者收集了大概400million(image,text)的样本。所得到的数据规模和用于训练GPT-2数据大致在同一个级别。 2.2选择一个有效的预训练方法: 作者提到刚开始的做法和VirTex类似,联合的在imageCNN和textTransformer上从头训练,以预测图像中的语言。然而,作者在扩大化该模型时,遇到了困难。如图2所示,此处的效率值与bagofwordsprediction的方式相比,效率低了将近三倍。最近一些对比表示学习的工作表明:对比目标可以超过同等的预测目标(contrastiveobjectivescanoutperform
目录一、开心一刻二、自绘树节点?三、效果展示四、实现思路1、可扩展接口2、函数重写3、同步左侧表头五、相关文章 原文链接:Qt实现表格树控件-自绘树节点虚线 一、开心一刻 一程序员第一次上女朋友家她妈板着脸问:你想娶我女儿,有多少存款? 程序员低了下头:五百! 她妈更鄙视了:才五百块,买个厕所都不够! 程序员忙说:不是人民币! 她妈:就算是美元,还是不够买厕所! 程序员:其实是比特币! 她妈:哇,贤婿,我给你买只大龙虾去 二、自绘树节点? 自绘树节点?听起来都挺复杂的,可是为什么还要自绘树节点呢?这充分说明产品的脑子是什么东西都能想出来的。 有一天产品说我们的软件里缺少一个美丽的树控件,然后就要求开发去实现这个功能。 对于有一定开发经验的同学可能直接会去百度,或者上Qt帮助文档上查找资料,然后发现直接设置qss就能达到我们需要的效果,于是一顿操作后,发现效果还是不错滴。 setStyleSheet("" "QTreeView{outline:none;show-decoration-selected:1;}" "QTreeView{outline:non
基本问题 1、memcached的基本设置 1)启动Memcache的服务器端 #/usr/local/bin/memcached-d-m10-uroot-l192.168.0.200-p12000-c256-P/tmp/memcached.pid -d选项是启动一个守护进程, -m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB, -u是运行Memcache的用户,我这里是root, -l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.0.200, -p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口, -c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定, -P是设置保存Memcache的pid文件,我这里是保存在/tmp/memcached.pid, 2)如果要结束Memcache进程,执行: #kill`cat/tmp/memcached.pid` 哈希算法将任意长
转自:http://blog.csdn.net/dr_neo/article/details/49870587 第一步、安装JDK; 第二步、安装Eclipse; 第三步、下载并安装AndroidSDK; 第四步、为Eclipse安装ADT插件 下面详细介绍。 第一步、安装JDK Android开发工具要求必须安装JDK(JavaDevelopmentKit),不能只安装JRE(Java RuntimeEdition),在安装Android开发工具之前需要先安装JavaJDK。尤其是Eclipse的开发过程必须要JDK或者JRE的支持,否则在启动Eclipse的时候就会报错: 首先,去Java官网上(http://www.Oracle.com/technetwork/java/javase/downloads/index.html)下载JDK(注意是下载JDK,不是JRE), 点击JDK下载按钮后,进入JDK版本选择界面,找到适合自己电脑系统的JDK版本,并下载,如下图所示,win32位的系统选择Windo
1.spring架构: spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。 2.spring架构图: 2.1)IoC(InversionofControl)控制反转,对象创建责任的反转,在spring中BeanFacotory是IoC容器的核心接口,负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。XmlBeanFacotory实现BeanFactory接口,通过获取xml配置文件数据,组成应用对象及对象间的依赖关系。spring中有三种注入方式,一种是set注入,一种是接口注入,另一种是构造方法注入。 2.2)AOP面向切面编程 aop就是纵向的编程,如下图所示,业务1和业务2都需要一个共同的操作,与其往每个业务中都添加同样的代码,不如写一遍代码,让两个业务共同使用这段代码。 spring中面向切面变成的实现
转自:http://www.cdtarena.com/qrs.html 电池是UPS系统中最不可靠的部分,但是UPS设计得好坏直接影响到电池的可靠性。让电池一直保持充电状态(即使UPS停机)能延长电池的寿命,尽量避免选用电池电压高的UPS。有的UPS设计会使电池产生纹波电流,造成电池不必要的过热。大多数UPS使用的电池都差不多,但UPS设计不同会大大影响电池的寿命。 使UPS使用的是同样的电池技术,不同厂家的电池寿命大不一样,这一点对用户很重要,因为更换电池的成本很高(UPS售价的30%)。电池故障会减小系统的可靠性,是非常烦人的事情。 电池温度影响电池可靠性 温度对电池的自然老化过程有很大影响。详细的实验数据表明温度每上升摄氏5度,电池寿命就下降10%,所以UPS的设计应让电池保持尽可能低的温度。所有在线式和后备/在线混合式UPS比后备式或在线互动式UPS运行时发热量要大(所以前者要安装风扇),这也是后备式或在线互动式UPS电池更换周期相对较长的一个重要原因。APCUPS电池的温度降到最低了,所以它能更好地满足系统可靠性要求。 电池充电器设计影响电池可靠性
微信小程序下拉滚动选择器picker绑定数据的两种方式 本地数据绑定和wx.request(OBJECT)json数据绑定 1.本地数据绑定(对象数组) Page({ data:{ //户型这是一个本地的对象,然后绑定到页面上 pic_array:[ {id:13,name:'1室1厅1卫'}, {id:14,name:'1室2厅1卫'}, {id:15,name:'2室1厅1卫'}, {id:16,name:'3室1厅2卫'}, {id:17,name:'4室1厅2卫'}, {id:18,name:'5室1厅3卫'}, {id:19,name:'6室1厅3卫'}, {id:20,name:'7室以上'}, ], hx_index:0; }, 复制 bindPickerChange_hx:function(e){ console.log('picker发送选择改变,携带值为',e.detail.value); this.setDa