我的某个程序里有这样一段代码,把程序挂在服务器爬取信息,因此用到死循环,同时又需要进行三个任务,于是使用了多线程。
刚开始在死循环部分并没有加time.sleep(60)
,于是它一直在for循环,同时会进行.is_alive()
(不确定这个消耗大不大),但总之这使得CPU占用过高。
而加上sleep之后,直接就降下去了(哭)
if __name__ == '__main__':
......
jwc_t = threading.Thread(name='jwc', target=jwc.loop)
xg_t = threading.Thread(name='xg', target=xg.loop)
pec_t = threading.Thread(name='pec', target=pec.loop)
threads = [jwc_t, xg_t, pec_t]
for thread in threads:
thread.daemon = True
thread.start()
# 控制程序退出,有这个就能检测Ctrl+C了
"""
多线程并不能接受到发送给主线程的Ctrl+C,而主线程结束子线程并不会解锁
所以将子线程设置为守护线程,这样主线程结束守护线程也会解锁
故为了让主线程可以被控制,就要加个while 循环等待接收信号
(注释掉下面内容程序秒停)
"""
# 可能是工程上的一般写法,要关注到子线程的存活
while True:
alive = True
for thread in threads:
alive = alive and thread.is_alive()
time.sleep(60) # 加sleep以减少CPU消耗
if not alive:
break
# # 对该项目更简单写法
# while True:
# # pass # 不好,CPU占用更高
# time.sleep(60)
想说的就是代码里注释写的,尽量用time.sleep()
来死循环,甚至pass
都可能不太好