Python的time.sleep() 和 apscheduler定时任务的区别

apscheduler是用的threading里的wait()与sleep()区别就是

sleep()等完一个DELAY,且没有释放锁。

wait()是一个while根据flag等于true或false决定是否阻塞,wait()方法会释放锁,当另外一个线程使用 notify() or notify_all()唤醒它之前会一直阻塞。一旦被唤醒,wait()会重新获得锁并返回。

wait()使用场景就是可能多线程a炒菜b切菜 需要等待一下b切好,a能拿到,做一个同步什么的

 sleep()就是没其他代码需要配合等完就完事了,或者其他的代码在其他线程跑跟这个没有交互

而显然用定时任务框架和用time.sleep()的区别就是  需求复杂度的问题,如果需要周期性定时任务或者对任务进行一些管理调度就用框架,一个循环+sleep重复执行就能满足需求就不用。

--------------------------------------------------

最近在优化项目,之前很多练手的爬虫想用定时任务重新做一下,但是因为学习python的时候并没有学习到定时任务框架,现在用到了就自己学习了一下,研究了一下time.sleep() 和 apscheduler定时任务的区别,发出来做个笔记

大概的需求是这样

有一些个账号存在list里,每天(每个固定周期)遍历一遍这个list里所有账号,调用方法爬取对应数据

这里可以用time.sleep()加 多线程threading模块实现定时任务

也可以使用如 apscheduler 这种定时任务框架实现,当然要做同步就实现一下消息队列这里不扩展,我先想了解一下apscheduler底层是用的什么呢 是怎么实现的

APScheduler 支持三种调度任务:固定时间间隔,固定的某个时间点(日期),Linux下Crontab 命令(cron表达式)。同时,它还支持异步执行、后台执行调度任务。

暂时先看了一下最常用的两种调度类型BlockingScheduler与BackgroundScheduler

BlockingScheduler会阻塞主线程BackgroundScheduler则不会

也就是说

 scheduler.start()

后的代码会不会运行的意思

然后我们测了一下任务的进程ID都相同,但线程ID不同。所以,APScheduler是以线程的方式实现调度执行的。

好那最后的问题就是APScheduler的BlockingScheduler调度方式的底层原理与time.sleep()的区别

点开BlockingScheduler的源码,可以看到start是实现了一个 Event事件,继续往下看可以看到这个事件的wait()方法会一直阻塞,直到标记被删除。最后就可以看到,是用的threading.Event的wait(),这与使用time.sleep()的区别是

wait(),设置exit_flag.wait(timeout=DELAY)可以立即脱离while循环。就是说wait()释放了锁使得其他线程可以使用同步控制块或者方法。

而使用time.sleep不释放锁,即使在设置了事件之后,也要在time.sleep调用中等待,直到您睡眠了DELAY秒。 

显然虽然使用wait需要频繁地重新获取GIL可能比睡满DELAY需要更多的CPU,但它的好处是更具响应性。 

而BackgroundScheduler继承于BlockingScheduler,只不过BackgroudScheduler执行轮询的操作时单开了一个线程,因此不会阻塞主程序的运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值