Python

【Python】signalを使った定期処理の注意点

はじめに

Python で定期処理を実行する方法として、以下の schedule モジュールを紹介しました。

schedule モジュールを使用した場合、一般的にイメージする定期処理を行うことができず、
実行周期のズレが発生していました。

今回は、そのズレを起こさない「定周期処理」の実現方法として、
シグナル(Signal)を使う方法をサンプルを交えながら紹介します。

SANACHAN
SANACHAN
Unix系OS限定の方法になります。

 

期待する定周期処理

この記事では、以下の動作を期待する「定周期処理」として解説しています。

例えば、5秒間隔(t=5秒)に1回実行したい処理がある場合、Job が完了する時間に左右されることなく、
定期的に Job が実行されることを期待値として考えます。

 

シグナル(signal)の基本的な使い方

使い方

Unix 系 OS では、時間の経過を知らせるシグナルとして SIGALRM が用意されています。
Python で SIGALRM を使用する場合は、以下のように記述します。

書式

SANACHAN
SANACHAN
時間・間隔は、小数点(float)も指定できます。

 

シグナル(signal)を使用する場合の注意点

シグナルは Unix 系システムにおける特殊な仕組みで、
ソフトウェアから見ると「割り込み」のような動作をします。

そのため、登録したハンドラーの中で行えることに制限が生まれます。

SANACHAN
SANACHAN
かなり低レイヤーの関数において、使用できるか否かに縛りがあります。

 

これは Python 言語に限った話ではなく、他の言語においても注意しなければなりません。
C言語のページで詳しく解説していますので、こちらも参考にどうぞ。

 

一方、Python はインタプリタ言語です。
Python のコードを構文解析して実行するエンジンは、C言語で記述されています。

SIGALRM 周辺のコードは、以下のように記述されています。

ご覧の通り、sigactionsetitimer など、C言語で記述する場合と同じように
低レイヤーの関数を呼び出してハンドラーを登録しています。

つまり、Python でシグナルを扱う場合も同じ制約を受けるため、
ハンドラーの中で記述できる処理に制限があることを意味しています。

しかし、Python で呼び出したモジュールの処理を一つ一つ確認することは困難なため、
実際のところはシグナルを使えるケースが無いと言っていいでしょう

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-Python
-, ,