剛學完怎麼用Python實現定時任務,轉頭就跑去撩妹!
一、發送消息
import smtplib from email.mime.text import MIMEText from email.header import Header def send_massage(text): from_addr = '[email protected]' # 郵件發送人賬號 to_addrs = '[email protected]' # 接收人郵件賬號,可以寫自己的 qqCode = 'ohkp123fmsldiji' # 授權碼(這個要填自己獲取到的) stmp = smtplib.SMTP_SSL('smtp.qq.com', 465)# 配置服務器 stmp.login(from_addr, qqCode)#發送人登陸 message = MIMEText(text, 'plain', 'utf-8') # 發送的內容 message['From'] = Header("你的愛人", 'utf-8') # 發件人 message['To'] = Header("老婆", 'utf-8') # 收件人 subject = '每天都給你發消息'#主題 message['Subject'] = Header(subject, 'utf-8') # 郵件標題 try: stmp.sendmail(from_addr, to_addrs, message.as_string())# 發送 except Exception as e: print('郵件發送失敗--' + str(e)) send_massage("因為痛苦太有價值,因為回憶太珍貴,所以我們更要繼續往前走")
如圖,這下,發送消息的函數已經有瞭,然後我們繼續來看。
二、定時發送消息
女朋友說:我要你每天早上8點,給我發送一條消息。
A方案(無裝飾器,傳參)
a、不傳參
模塊隻需要導入import schedule
schedule.every().day.at("8:00").do(send_massage)#不傳參數while True:#循環控制 schedule.run_pending()#run_pending:運行所有可以運行的任務 time.sleep(1)#防止運算速度過快,添加等待。如果不添加可能會導致計算機卡頓。Cpu直線飆升
就這麼搞定瞭,然後女朋友又說瞭,你怎麼沒有給我發送內容。
好嘛,參數沒傳。
b、傳參
schedule.every().day.at("8:00").do(send_massage,text="內容")#傳參數,多個就傳多個
B方案(有裝飾器,傳參)
a、不傳參
from schedule import * @repeat(every().day.at("8:00"))#在所需函數前添加 def send_massage(text):… while True:#循環控制 run_pending()#run_pending:運行所有可以運行的任務 time.sleep(1)#防止運算速度過快,添加等待。如果不添加可能會導致計算機卡頓。Cpu直線飆升
b、傳參
from schedule import * @repeat(every().day.at("8:00"),text="內容")#在所需函數前添加,參數多個就傳多個 def send_massage(text):… while True:#循環控制 run_pending()#run_pending:運行所有可以運行的任務 time.sleep(1)#防止運算速度過快,添加等待。如果不添加可能會導致計算機卡頓。Cpu直線飆升
三、多線程發送消息
好瞭,現在女朋友的需求又變瞭,她說:我要你每天早上8:00給我發早安,晚上八點給我發晚安。中午你也還要發消息給我。
A方案(無裝飾器,傳參)
a、不傳參
因為需要使用多線程,那肯定要使用模塊threading
import threading import schedule 需要添加一個多線程的函數, def run_threaded(func): job_thread = threading.Thread(target=func) job_thread.start() schedule.every().day.at("8:00").do(run_threaded,send_message)#線程1 schedule.every().day.at("20:00").do(run_threaded,send_message)#線程2, while True: schedule.run_pending() time.sleep()
b、傳遞參數
需要給線程傳遞參數,再通過線程把參數傳給函數:
def run_threaded(func,text): job_thread = threading.Thread(target=func,args=(text,)) job_thread.start() schedule.every().day.at("8:00").do(run_threaded,send_message,text="內容")#線程1 schedule.every().day.at("20:00").do(run_threaded,send_message,text="內容")#線程2 while True: schedule.run_pending() time.sleep(1)
B方案(有裝飾器,傳參)
a、不傳參
裝飾器不再使用對應函數上方,而使用在啟動多線程函數的上方,添加一個裝飾器表示一個任務,多添加幾個就是多個瞭,是不是很神奇
@repeat(every().day.at("8:00"),func=send_massage) @repeat(every().day.at("20:00"),func=send_massage) def run_threaded(func): job_thread = threading.Thread(target=func) job_thread.start() while True: run_pending() time.sleep(1)
b、傳參
傳參的方式也大同小異,裝飾器不再使用對應函數上方,而使用在啟動多線程函數的上方,如下:
@repeat(every().day.at("8:00"),func=send_massage,text="2354") @repeat(every().day.at("20:00"),func=send_massage,text="235412341234") def run_threaded(func,text): job_thread = threading.Thread(target=func,args=(text,)) job_thread.start() while True: run_pending() time.sleep(1)
四、總結
1、常用方法名:
""" second,秒;seconds minute,分鐘;minutes hour,時;hours day,天;days monday,周一 tuesday,周二 wednesday,周三 thursday,周四 friday,周五 saturday,周六 sunday,周日 主要方法: at 在……時候 to …到… until 直到……時候 """
2、常用函數方法:
a、無裝飾器
schedule.every(10).seconds.do(job)#每10秒運行一次 schedule.every(10).minutes.do(job)#每隔十分鐘執行一次任務 schedule.every().hour.do(job)#每小時運行一次 schedule.every().day.at("10:30").do(job)##每天的10:30執行一次任務 schedule.every(5).to(10).minutes.do(job)#每隔5到10分鐘執行一次任務 schedule.every(5).to(10).days.do(job)#每隔5到10天執行一次任務 schedule.every().monday.do(job)#每周一的這個時候執行一次任務 schedule.every().wednesday.at("13:15").do(job)#每周三13:15執行一次任務 schedule.every().minute.at(":17").do(job)#每分鐘在第17秒的時候執行任務 schedule.every().hour.at(":17").do(job)#每小時在第17分鐘的時候執行任務 schedule.every().hours.until("18:30").do(job)# 每個小時運行作業,18:30結束 schedule.every().hours.until("2030-01-01 18:33").do(job)# 每個小時運行作業,2030-01-01 18:33後停止 schedule.every().hours.until(timedelta(hours=8)).do(job)# 每個小時運行作業,8個小時後停止
b、有裝飾器
@repeat(every(10).seconds)#每10秒運行一次 @repeat(every(10).minutes)#每隔十分鐘執行一次任務 @repeat(every().hour)#每小時運行一次 @repeat(every().day.at("10:30"))##每天的10:30執行一次任務 @repeat(every(5).to(10).minutes)#每隔5到10分鐘執行一次任務 @repeat(every(5).to(10).days)#每隔5到10天執行一次任務 @repeat(every().monday)#每周一的這個時候執行一次任務 @repeat(every().wednesday.at("13:15"))#每周三13:15執行一次任務 @repeat(every().minute.at(":17"))#每分鐘在第17秒的時候執行任務 @repeat(every().hour.at(":17"))#每小時在第17分鐘的時候執行任務@repeat(every().hours.until("18:30"))# 每個小時運行作業,18:30結束@repeat(every().hours.until("2030-01-01 18:33"))# 每個小時運行作業,2030-01-01 18:33後停止 @repeat(every().hours.until(timedelta(hours=8)))# 每個小時運行作業,8個小時後停止
3、總結思路
其實單線程和多線程是相通的,重要的是融匯貫通。先掌握單線程,多線程也就迎刃而解瞭。
多線程唯一不同的不再是使用已確定的函數,而是轉變為新開啟一個線程去執行我們需要的函數。思路如圖:
五、定時給女朋友發送消息,完整代碼
定時每天早上,晚上發送消息完整代碼
import smtplib from email.mime.text import MIMEText from email.header import Header import threading from schedule import * def send_massage(text): from_addr = '[email protected]' # 郵件發送人賬號 to_addrs = '[email protected]' # 接收人郵件賬號,可以寫自己的 qqCode = 'ohkpw123fmsldiji' # 授權碼(這個要填自己獲取到的) stmp = smtplib.SMTP_SSL('smtp.qq.com', 465)# 配置服務器 stmp.login(from_addr, qqCode)#發送人登陸 message = MIMEText(text, 'plain', 'utf-8') # 發送的內容 message['From'] = Header("你的愛人", 'utf-8') # 發件人 message['To'] = Header("老婆", 'utf-8') # 收件人 subject = '每天都給你發消息'#主題 message['Subject'] = Header(subject, 'utf-8') # 郵件標題 try: stmp.sendmail(from_addr, to_addrs, message.as_string())# 發送 except Exception as e: print('郵件發送失敗--' + str(e))@repeat(every().day.at("10:00"),func=send_massage,text="早上好")#at之後時間不能小於當前時間。 @repeat(every().day.at("20:00"),func=send_massage,text="晚上好") def run_thread(func,text):#多線程 thread = threading.Thread(target=func,args=(text,)) thread.start() if __name__ == '__main__': while True: run_pending() time.sleep(1)
當看見他把代碼部署到服務器,並每天給女朋友發送消息時,心裡莫名的難受,買個服務器你用來掛機掙遊戲掙金幣不香嗎?
到此這篇關於剛學完怎麼用Python實現定時任務,轉頭就跑去撩妹!的文章就介紹到這瞭,更多相關Python實現定時任務內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python使用定時調度任務的方式
- Python中schedule模塊定時任務的使用方法(2)
- python threading模塊的使用指南
- python中進程間通信及設置狀態量控制另一個進程
- Python threading和Thread模塊及線程的實現