LoginSignup
1
5

More than 3 years have passed since last update.

PythonのQueueとSchedulerについてのまとめ

Last updated at Posted at 2018-09-05

PythonのQueueとSchedulerについてのまとめ

公式のリファレンスを見て、自分なりにまとめたものを置いておきます.
python3.3以降の環境での仕様であり、それ以前だと引数の扱いが微妙に異なります.


Queue

url
multi-producerとmulti-consumerを使う上で基礎となるライブラリ.
マルチスレッドプログラミングで情報をやりとりする際に必要な排他処理が備わっているのでとっても便利.

import

    import sched

例外

  • queue.Empty
    queue.getで投げられる.
  • queue.Full
    queue.putで投げられる.

オブジェクト

  • Queue.qsize()
    queueの近似サイズを返すよ.
  • Queue.empty(), Queue.full()
    そのままの意味で、TrueかFalseを返す.
    ただ、例えばempty()がFalseを返したとしても、後続のget()がブロックしないことは保証されない.
    なぜかは分からん.
  • Queue.join()
    すべてのアイテムが取り出されるまでブロックされる.
  • Queue.put(item, block=True, timeout=None)
    これを使う場合は、以下の3パターンが考えられる.

    • item, block=True, timeout=None
      スロットが利用可能になるまでずっと待つ. 利用可能ならばitemをqueueに入れる.
    • item, block=True, timeout=正の数
      スロットが利用可能になるまでは最大でtimeout秒間待つ.
      待っても利用可能にならない場合は例外Fullを出す.
    • item, block=False
      利用可能ならばitemをqueueに入れるが、できないならFullを出す.
      timeoutは指定しても無視される.
  • Queue.put_nowait(item, block=True, timeout=None)
    Queue.put(item, block=False)と等価.

  • Queue.get(block=True, timeout=None)
    Queue.put()と似た感じ

  • Queue.get_nowait()
    QUeue.put_nowait()と似た感じ


Scheduler

ソース
現実世界の時間を意識して複数の関数を扱いたいときに使う.
個人的には、マルチスレッドの親玉として認識してる.

import

    import sched

オブジェクト

  • sched.scheduler(timefunc=time.monotonic, delayfunc=time.sleep)
    time.monotonicが無ければtime.timeを使うようになっている.
    実行環境によってデフォルト引数の型が変化するのは避けたいので、shed.scheduler(time.time)としてtime.timeを利用することをオススメするよ.

  • scheduler.enterabs(time, priority, action, argument=(), kwargs={})

    • 概要
      関数(action)をイベントとして登録する. 現実世界の、ある時間で関数を呼び出したい時に使う.
    • 戻り値
      後で登録した関数(action)をキャンセルできるように、eventを返す.
    • 引数
      timeで関数を呼び出すタイミングを指定する.
      時間を扱う型はいくつもあるので、ここではschedulerのコンストラクタ第1引数で定義した時間の型を使って指定する.
      action,argument,kwargsは以下のように使うよ.
def printTime(a='default'):
    print(a)

s = sched.scheduler(time.time, time.sleep)
s.enter(5, 2, print_time, argument=('s.run()の5秒後に呼ばれるよ(優先度: 高)',))
s.enter(5, 1, print_time, kwargs={'a': 's.run()の5秒後に呼ばれるよ(優先度: 低)'})
s.run()
  • scheduler.enter(delay, priority, action, argument=(), kwargs={})

    • 概要 scheduler.enterabsの、相対時間で指定したいときに使う版.
      例えばプログラムを起動した3秒後に起動音を鳴らすみたいな場合とかね.
  • scheduler.cancel(event)

    • 概要
      enter,enterabsで登録したものをキャンセルできる.
    • 例外
      存在しないeventを引数で指定していた場合はValueErrorを吐く.
  • scheduler.empty()
    もしイベントキューが空ならば、Trueを返す.

  • scheduler.run(blocking=True)

    • 概要
      実行されるイベントの時間が来るまで待機し、登録されたイベントのタイミングごとに、同じスレッド上でイベントを実行する.

      実行するイベントを待つときはSchedulerのコンストラクタで指定した関数を用いて待機する.

      あと、スケジューラー自体はマルチスレッドではない.

      もし実行されたイベントがなかなか終わらずに次のイベントの呼び出し時間が来てしまった場合は、単に次のイベントが呼び出されるのが遅くなるだけ.

      特にイベントが落ちるとかは無いし、例外も投げない.

      そういったことはscheduler.cancelの役目らしい.

    • 例外
      action(登録された関数)で投げられた例外をそのまま伝播する.
      actionで例外が投げられたときは以降

    • よく分からんかったとこ

If an exception is raised by action, the event will not be attempted in future calls to run().
  • scheduler.queue
    • 概要
      登録されたイベントが呼び出される順序ごとに整列したリストとして返される.
    • 戻り値
      リストを返す. リストの各要素はイベントの情報がタプルで入っている.
1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5