为什么呢 那就得回顾一下操作系统相关的知识
操作系统的 CPU 现在可能有四核、八核、16核 但是我们打开tomcat线程数一看有120多
那么操作系统的 CPU 就要有正确的调度规则 , 操作系统中有很多算法 Unix系统使用的是时间片算法,而Windows则属于抢占式的。
在时间片算法中,所有的进程排成一个队列。操作系统按照他们的顺序,给每个进程分配一段时间,即该进程允许运行的时间。如果在 时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则 CPU 当即进行切换。调度程 序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。
所谓抢占式操作系统,就是说如果一个进程得到了 CPU 时间,除非它自己放弃使用 CPU ,否则将完全霸占 CPU 。因此可以看出,在抢 占式操作系统中,操作系统假设所有的进程都是“人品很好”的,会主动退出 CPU 。
在抢占式操作系统中,假设有若干进程,操作系统会根据他们的优先级、饥饿时间(已经多长时间没有使用过 CPU 了),给他们算出一 个总的优先级来。操作系统就会把 CPU 交给总优先级最高的这个进程。当进程执行完毕或者自己主动挂起后,操作系统就会重新计算一 次所有进程的总优先级,然后再挑一个优先级最高的把 CPU 控制权交给他。
回到我们的问题 我们如果写一个while(true) 而不加线程睡眠,那么此线程告诉操作系统的是 我要一直占用资源
如果写一个Thread.sleep(0) ,那么告诉操作系统的是 我可以让出资源给其他人 但是是给优先级比我高的 这样修改有效果 但是不是很明显
如果写一个Thread.sleep(1), 那么告诉操作系统的事 我可以让出资源 并且休息1ms 这样优先级低的也可以持有资源了
那么提出一个疑问 我在 2022-01-19 02:00:00,000 休眠线程 写一个Thrad.sleep(1000) ,那么在一秒后真的会继续执行嘛,答案是否定的一秒后 如果有其他资源还在持有CPU资源 就不会执行。当然这个会很快
所以以后的大循环 甚至 while(true) 建议加一个 Thread.sleep(1) 这样不会一直持有资源
背景最近工作中碰到一个问题测试系统稳定性的时候发现 CPU 一直爆满经过多方面排查 发现是多处用了while(true)处理办法在while(true) 的代码中加一个 Thread.sleep(1)即可事后思考为什么呢 那就得回顾一下操作系统相关的知识操作系统的 CPU 现在可能有四核、八核、16核 但是我们打开tomcat线程数一看有120多那么操作系统的 CPU 就要有正确的调度规则 , 操作系统中有很多算法 Unix系统使用的是时间片算法,而Windows则属.
实测之后确实可以,之前开启4个程序之后
CPU
占用100%,现在开了7个仅仅占用了15%不到,今天又进步了。
分享一下使用方法。
Private m_csWaitHandle As New ManualResetEvent(False)
Private Sub MelsecPlCReade()
记
得以前的windows 任务定时是可以的正常使用的,今天试了下,发现不能正常使用了,任务计划总是挂起。
接下来
记
录下python 爬虫定时任务的几种解决方法。
今天是第一篇,后面会陆续更新。
首先最容易的是while
true
死循环挂起,上代码
import osimport timeimport sysfrom datetime import datetime, timedelta
def One_Plan():
# 设置启动周期
Second_update_time = 24 * 60 * 60
# 当前时间
now_Time = datetime.now()
写while
True
(循环)的一点建议写while
True
(循环)的一点建议写while
True
(循环)的一点建议
在while(
true
)循环中,最好加入Thread.Sleep(1)的睡眠操作,可以大大降低
CPU
的负担
while(
true
)
// 工作代码
Thread.Sleep(1)
最近接到TL分配的新任务,维护一个之前的新应用,在开发新需求的同时,不免也需要排查一些前人代码中埋下的坑。这不最近就出现了线上环境服务
CPU
较高的情况,让我们一起来围观下怎么对
CPU
过高问题进行分析以及解决的。
说明:由于是公司线上业务,这里的业务说明以及代码都进行了脱敏处理。
线上出现服务
CPU
占用过高的问题,于是小枫使用top命令定位到
CPU
比较高的进程ID,再结合jstack命令,导出
CPU
高的进程的线程信息,定位到问题代码(如何进行线上问题排查不是本文的重点,这里一笔带过,后
一、为什么死循环占用
CPU
高
Q:一个进程如果是死循环,那么占有的
CPU
会很高,可是操作系统时间片运行到一定时间不是会自动切换到别的进程吗?既然如此,即便是死循环,到时间还是会切换到别的进程,为什么占用
CPU
会高呢?
A:到时候的确会切换到别的进程。
可以这样理解:当切换到别的进程时,别的进程告诉系统自己没什么事情要做,不需要那么多的时间,这个时候系统就会切换到下一个进程,直到回到这个死循环...
在服务器中,会存在下面的while
true
方法,服务器需要一直接受请求,所以需要死循环一直运行着,如果没有添加sleep那么下面的代码会直接占用100%的
cpu
,导致别的应用没有执行权。这种情况叫做
CPU
空转如果加了sleep,哪怕sleep 1ms,
cpu
的占用率会降到3%左右(个人pc测试),总之就是会明显减低
cpu
使用率。
while(
true
){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
由于项目需要用到安卓多线程操作,结果开了四条线程,下载到平板一直很卡,
CPU
占用率暴涨。于是开始查找原因,发现是线程run()方法里的while(
true
)导致的,
下图是为解决时开启一条while(
true
)线程的
CPU
占用率,很明显,就开了一条,电脑模拟器
CPU
就占用了43%,开两条直接90%导致电脑卡死所以这个问题很严重。
这是解决后的
CPU
占用率,从图中可知,开启了25条线...
一、为什么死循环占用
CPU
高
一个进程如果是死循环,那么占有的
CPU
会很高,可以操作系统时间片运行的,到了一定时间不是会自动切换到别的进程吗?既然即便是死循环,到时间还是会切换到别的进程,为什么占用
CPU
会高呢?
到时候的确会切换到别的进程。
可以这样理解:当切换到别的进程时,别的进程告诉系统自己没什么事情要做,不需要那么多的时间,这个时候系统就会切换到下一个进程,直到回到这个死循环的
我们做项目时通常需要接收用户输入的各种类型数据,比如说请用户输入年龄,那么我们就用 int age = scanner.nextInt();来接收对吧!
public class 输入不匹配异常 {
static Scanner scanner = new Scanner(System.in);//静态方法,接收用户的输入
public static void main(String[] args) {
System.out.println("请输入年龄");
int age = sc
在项目中我们有时通过while (
true
) 来循环接受消息,但如果在单核
cpu
上这样使用的话会造成
cpu
使用率达到100%,所以我们通过sleep让线程间隔性的执行。这样避免while(
true
) 空转浪费
cpu
,这时可以使用 yield 或 sleep 来让出
cpu
的使用权给其他程序
public static void main(String[] args){
while (
true
) {
System.out.println("========+++==
【1】Sleep(0)正如 参数所示,在远小于1 ms 的时间片内允许其他线程调度
CPU
的运行,而保留了绝大部分
CPU
时间片为本线程运 行
【2】换句话说就是Sleep(0)几乎掌控了所有
CPU
的使用权,而非让出
CPU
使用权。
【2】相反:Sleep(1)在参数非0 下,休眠1 ms并且极大的让出
CPU
使用权, 但可能正由于让出
CPU
使用权,使得本Sleep休眠控制的很不精