Python3によるタスクのタイミングループ実行の実装

anonymity
リリース: 2019-04-19 13:27:33
オリジナル
12867 人が閲覧しました

実際の開発では、特定の機能モジュールやタスクを同じ時間内で周期的に実行したいという要件がよくあります。ここでタイマーという概念が出てきますが、具体的にはどのように実装すればよいのでしょうか?タイマーには、スレッドの実行を制御したり、システム消費量を削減したりできる、非常に実用的な機能が多数あります。それでは、Python3 でタイミング関数を実装する練習をしてみましょう。

Python3によるタスクのタイミングループ実行の実装

たとえば、Python を使用してクローラ システムを開発する場合、データを監視するスレッド サービスを実装するために、一定の間隔でタスクを繰り返し実行する必要がある場合があります。クロールのステータスやタイマーがここで役に立ちます。

[ビデオ推奨: Python3 ビデオ チュートリアル]

[マニュアル推奨: Python 中国語マニュアル]

Python ドキュメントを通じてタイミング関数を実装するための threading.Timer() を見つけることができます:

簡単な実装コード:

import threading
def func1(a):
    #Do something
    print('Do something')
    a+=1
    print(a)
    print('当前线程数为{}'.format(threading.activeCount()))
    if a>5:
        return
    t=threading.Timer(5,func1,(a,))
    t.start()
ログイン後にコピー

レンダリング:

Python3によるタスクのタイミングループ実行の実装

# #この情報を参照すると、Python を使用して 3 つの異なるスケジュールされたタスクの実行方法を実装できます:

1. スケジュールされたタスクのコード

#!/user/bin/env python
#定时执行任务命令
import time,os,sched
schedule = sched.scheduler(time.time,time.sleep)
def perform_command(cmd,inc):
  os.system(cmd)
  print('task')
def timming_exe(cmd,inc=60):
  schedule.enter(inc,0,perform_command,(cmd,inc))
  schedule.run()
print('show time after 2 seconds:')
timming_exe('echo %time%',2)
ログイン後にコピー

2. タスクの定期的な実行

#!/user/bin/env python
import time,os,sched
schedule = sched.scheduler(time.time,time.sleep)
def perform_command(cmd,inc):
  #在inc秒后再次运行自己,即周期运行
  schedule.enter(inc, 0, perform_command, (cmd, inc))
  os.system(cmd)
def timming_exe(cmd,inc=60):
  schedule.enter(inc,0,perform_command,(cmd,inc))
  schedule.run()#持续运行,直到计划时间队列变成空为止
print('show time after 2 seconds:')
timming_exe('echo %time%',2)
ログイン後にコピー

3 .Loop 実行コマンド

#!/user/bin/env python
import time,os
def re_exe(cmd,inc = 60):
  while True:
    os.system(cmd)
    time.sleep(inc)
re_exe("echo %time%",5)
ログイン後にコピー

要約: Python のタイマー実装方法はすべてスケジュールとスレッドに基づいており、具体的な使用方法は実際の状況に応じて柔軟に使用する必要があります。


最も一般的に使用される 2 つのモジュール: スレッド、スケジュール

スレッド モジュールの使用法:


import threading ,time
from time import sleep, ctime
class Timer(threading.Thread):
        """
        very simple but useless timer.
        """
        def __init__(self, seconds):
                self.runTime = seconds
                threading.Thread.__init__(self)
        def run(self):
                time.sleep(self.runTime)
                print ("Buzzzz!! Time's up!")
class CountDownTimer(Timer):
        """
        a timer that can counts down the seconds.
        """
        def run(self):
                counter = self.runTime
                for sec in range(self.runTime):
                        print (counter)
                        time.sleep(1.0)
                        counter -= 1
                print ("Done")
 
class CountDownExec(CountDownTimer):
        """
        a timer that execute an action at the end of the timer run.
        """
        def __init__(self, seconds, action, args=[]):
                self.args = args
                self.action = action
                CountDownTimer.__init__(self, seconds)
        def run(self):
                CountDownTimer.run(self)
                self.action(self.args)
 
def myAction(args=[]):
        print ("Performing my action with args:")
        print (args)
 
if __name__ == "__main__":
        t = CountDownExec(3, myAction, ["hello", "world"])
        t.start()
        print("2333")
ログイン後にコピー

Sched モジュールの使用法:


'''
使用sched模块实现的timer,sched模块不是循环的,一次调度被执行后就Over了,如果想再执行,
可以使用while循环的方式不停的调用该方法
'''
import time, sched
#被调度触发的函数
def event_func(msg):
    print("Current Time:", time.strftime("%y-%m-%d %H:%M:%S"), 'msg:', msg)
def run_function():
    #初始化sched模块的scheduler类
    s = sched.scheduler(time.time, time.sleep)
    #设置一个调度,因为time.sleep()的时间是一秒,所以timer的间隔时间就是sleep的时间,加上enter的第一个参数
    s.enter(0, 2, event_func, ("Timer event.",))
    s.run()
def timer1():
    while True:
        #sched模块不是循环的,一次调度被执行后就Over了,如果想再执行,可以使用while循环的方式不停的调用该方法
        time.sleep(1)
        run_function()
if __name__ == "__main__":
    timer1()
ログイン後にコピー

以上がPython3によるタスクのタイミングループ実行の実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート