Python実装のポイントとタイミングタスク4つの実装の下に見つけるより多くの方法は、各アプリケーションは、シーンに独自の方法があり、一般的に迅速にスケジュールされたタスクのPython実装を導入するために使用した後、それを見てみると、
最近、小さなプログラムの開発タスクを作りました、開発の背景部分を担当し、プロジェクトの要件、3つの定期的なタスクを達成するために必要に応じて:
1>マイクロチャネルは、定期的に2時間を更新するために、トークン更新。
2>オンラインの商品のタイミング。
3>タイミング検出バックグラウンドサービスは生きています。
これらの3つのタスクを達成するためのPythonを使用して、タイミング・ポイントに関連する知識を使用する必要があります。
実装の次の4を見つけるためのより多くの方法Python実装のポイントとタイミングタスクは、各アプリケーションは、シーンに独自の方法があり、一般的に迅速Pythonの実装のタイミングタスクを導入するために使用される以下の:
1>サイクル+スリープ。
2> Timerクラスモジュール糸。
3>スケジュールモジュール。
4>タイミングフレーム:APScheduler
(その外部環境に依存しない)タスクのセットアップを開始する前に:
1:タイミングポイントまたはCPUやメモリの使用状況を監視します。
2:保存時間、CPU、ログファイルへのメモリ使用量;
監視機能のシステムを実装するための最初:
準備:psutilインストール:ピップはpsutilをインストール
達成するための機能
#psutil:获取系统信息模块,可以获取CPU,内存,磁盘等的使用情况
import psutil
import time
import datetime
#logfile:监测信息写入文件
def MonitorSystem(logfile = None):
#获取cpu使用情况
cpuper = psutil.cpu_percent()
#获取内存使用情况:系统内存大小,使用内存,有效内存,内存使用率
mem = psutil.virtual_memory()
#内存使用率
memper = mem.percent
#获取当前时间
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
line = f'{ts} cpu:{cpuper}%, mem:{memper}%'
print(line)
if logfile:
logfile.write(line)
結果を実行するコード:
2019-03-21 14:23:41 cpu:0.6%, mem:77.2%
次は、私たちは、このようなシステムリソースの使用状況に3Sを監視して、定期的なモニタリングを実現したいです。
使用する最も簡単な方法:睡眠
+睡眠を達成することができる一方で使用する。このように、最も単純明快:
def loopMonitor():
while True:
MonitorSystem()
#2s检查一次
time.sleep(3)
loopMonitor()
出力:
2019-03-21 14:28:42 cpu:1.5%, mem:77.6%
2019-03-21 14:28:45 cpu:1.6%, mem:77.6%
2019-03-21 14:28:48 cpu:1.4%, mem:77.6%
2019-03-21 14:28:51 cpu:1.4%, mem:77.6%
2019-03-21 14:28:54 cpu:1.3%, mem:77.6%
このように問題があります:タイミングは、単一のタスクを処理することができます。
あなたがプログラミングの世界に残っている場合は混乱し、彼らの将来の計画を知りません
これは、上級開発エンジニアパイソン、戦闘ゼロベースのデータを仕上げているとウェブ開発、爬虫類、ジャンゴ、データマイニングや他のプロジェクトへの基本からPythonスクリプトです。どんな小さなPythonのパートナーに与えられました!細部に注意を払うに学習し、必要に方法のいくつかを共有します
再び新しいタスク:以下のコードを達成するために、バイト毎秒を送受信するためのネットワークニーズを監視:
def MonitorNetWork(logfile = None):
#获取网络收信息
netinfo = psutil.net_io_counters()
#获取当前时间
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
line = f'{ts} bytessent={netinfo.bytes_sent}, bytesrecv={netinfo.bytes_recv}'
print(line)
if logfile:
logfile.write(line)
MonitorNetWork()
コードの実行結果:
2019-03-21 14:47:21 bytessent=169752183, bytesrecv=1107900973
ミッションを監視しながら、我々は、whileループ内にある場合は状況が毎秒ネットワークを監視することができない、二つの問題を待たなければなりません。
タイマーの実装
基本的な理解タイマータイマーは、我々がスケジュールされたタスクを開始することができるということですオーダーの実施のための待ち時間が問題ではありませんので、これらのタスクは、非同期タイマーが実行されています。
タイマーの基本的な使用ではまず見て:
导入:スレッド輸入タイマーから
主な方法:
タイマーが唯一あなたが繰り返す必要がある場合、あなたは再び追加のタスクに必要な、一度に実行することができます。
基本的な使用で見てみましょう:
from threading import Timer
#记录当前时间
print(datetime.datetime.now())
#3S执行一次
sTimer = Timer(3, MonitorSystem)
#1S执行一次
nTimer = Timer(1, MonitorNetWork)
#使用线程方式执行
sTimer.start()
nTimer.start()
#等待结束
sTimer.join()
nTimer.join()
#记录结束时间
print(datetime.datetime.now())
出力:
あなたが見ることができる、それは3Sに時間がかかりますが、我々は何をしたい毎秒のネットワークの状態を監視することで、どのように対処します。
タイマーは、あなたが完了した後、再度実行するタスクを追加する必要があるので、私たちはコードを変更、一度に実行することができます。
from threading import Timer
import psutil
import time
import datetime
def MonitorSystem(logfile = None):
cpuper = psutil.cpu_percent()
mem = psutil.virtual_memory()
memper = mem.percent
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
line = f'{ts} cpu:{cpuper}%, mem:{memper}%'
print(line)
if logfile:
logfile.write(line)
#启动定时器任务,每三秒执行一次
Timer(3, MonitorSystem).start()
def MonitorNetWork(logfile = None):
netinfo = psutil.net_io_counters()
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
line = f'{ts} bytessent={netinfo.bytes_sent}, bytesrecv={netinfo.bytes_recv}'
print(line)
if logfile:
logfile.write(line)
#启动定时器任务,每秒执行一次
Timer(1, MonitorNetWork).start()
MonitorSystem()
MonitorNetWork()
結果:
あなたが時間から見ることができ、これらの2つのタスクが同時に何の問題を待つことはできません。
本質はそのリソースを心配しないでください、各実行が破壊されるの後、タスクを実行するためにタイマースレッドの方法を使用することです。
スケジューリングモジュール:スケジュール
スケジュール第三者が秒、分、時間、日付、またはカスタムイベント実行時間に応じて、軽量タスクスケジューリングモジュールです。
インストール:
ピップスケジュールをインストール
例で見てみましょう:
import datetime
import schedule
import time
def func():
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
print('do func time :',ts)
def func2():
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
print('do func2 time:',ts)
def tasklist():
#清空任务
schedule.clear()
#创建一个按秒间隔执行任务
schedule.every(1).seconds.do(func)
#创建一个按2秒间隔执行任务
schedule.every(2).seconds.do(func2)
#执行10S
for i in range(10):
schedule.run_pending()
time.sleep(1)
tasklist()
結果:
実施過程の分析:
1. jupyterで行うので、最初の空になったタスクスケジュールで、
タイムスケジュール追加タスク間2.セプタム;
3.ここ従うFUNC添加2秒間隔の関数func2によれば、第二の間隔を追加し、
タスク4.scheduleを加え、クエリタスクとタスクに必要、
5ポイントに2つ目のミッションごとのリソース集中型のクエリを防止するために、その後、実行順序。
我々はtime.sleep(2)を加え関数funcを、修正方法を理解するために、実行の五次
そしてだけFUNC作業出力を実行:
あなたは3S間隔時間を見ることができ、なぜ1Sはありませんか?
実行順序、FUNC睡眠2S、サイクリックタスクの照会睡眠1Sので、我々はこの問題を持っています。
在我们使用这种方式执行任务需要注意这种阻塞现象。
我们看下schedule模块常用使用方法:
#schedule.every(1)创建Job, seconds.do(func)按秒间隔查询并执行
schedule.every(1).seconds.do(func)
#添加任务按分执行
schedule.every(1).minutes.do(func)
#添加任务按天执行
schedule.every(1).days.do(func)
#添加任务按周执行
schedule.every().weeks.do(func)
#添加任务每周1执行,执行时间为下周一这一时刻时间
schedule.every().monday.do(func)
#每周1,1点15开始执行
schedule.every().monday.at("12:00").do(job)
这种方式局限性:如果工作任务回非常耗时就会影响其他任务执行。我们可以考虑使用并发机制配置这个模块使用。
任务框架APScheduler
APScheduler是Python的一个定时任务框架,用于执行周期或者定时任务,
可以基于日期、时间间隔,及类似于Linux上的定时任务crontab类型的定时任务;
该该框架不仅可以添加、删除定时任务,还可以将任务存储到数据库中,实现任务的持久化,使用起来非常方便。
安装方式:pip install apscheduler
apscheduler组件及简单说明:
1>triggers(触发器):触发器包含调度逻辑,每一个作业有它自己的触发器
2>job stores(作业存储):用来存储被调度的作业,默认的作业存储器是简单地把作业任务保存在内存中,支持存储到MongoDB,Redis数据库中
3> executors(执行器):执行器用来执行定时任务,只是将需要执行的任务放在新的线程或者线程池中运行
4>schedulers(调度器):调度器是将其它部分联系在一起,对使用者提供接口,进行任务添加,设置,删除。
来看一个简单例子:
import time
from apscheduler.schedulers.blocking import BlockingScheduler
def func():
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
print('do func time :',ts)
def func2():
#耗时2S
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
print('do func2 time:',ts)
time.sleep(2)
def dojob():
#创建调度器:BlockingScheduler
scheduler = BlockingScheduler()
#添加任务,时间间隔2S
scheduler.add_job(func, 'interval', seconds=2, id='test_job1')
#添加任务,时间间隔5S
scheduler.add_job(func2, 'interval', seconds=3, id='test_job2')
scheduler.start()
dojob()
输出结果:
输出结果中可以看到:任务就算是有延时,也不会影响其他任务执行。
APScheduler框架提供丰富接口去实现定时任务,可以去参考官方文档去查看使用方式。
最后选择:
简单总结上面四种定时定点任务实现:
1:循环+sleep方式适合简答测试,
2:timer可以实现定时任务,但是对定点任务来说,需要检查当前时间点;
3:schedule可以定点定时执行,但是需要在循环中检测任务,而且存在阻塞;
4:APScheduler框架更加强大,可以直接在里面添加定点与定时任务;
まとめると、APSchedulerフレームワークを使用するという決定、シンプルで、ちょうど直接タスクを作成し、スケジューラに追加することができます。
913066266、高齢者が学んでいる方法を見て:私たちは、Pythonのバックルqunを学ぶお勧めします!基本的なWeb開発Pythonスクリプトからなど、爬虫類、ジャンゴ、データマイニング、へ[PDF、実際のソースコード]、ゼロベースのプロジェクトの戦闘データに仕上げています。どんな小さなPythonのパートナーに与えられました!毎日、ダニエルが学び、細部に注意を払う必要性にする方法のいくつかを共有するために、タイミングPythonの技術を説明し、参加するためにクリックしてください私たちの集いのPythonの学習を