タイミングタスクを達成するためのpython3 4つの方法

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の学習を

公開された43元の記事 ウォン称賛22 ビュー60000 +

おすすめ

転載: blog.csdn.net/haoxun06/article/details/104544642