質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

4回答

11070閲覧

Pythonでの周期的処理(タイマ割込み)の使用

HiroPokeHero

総合スコア45

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/08/25 05:57

前提・実現したいこと

Pythonでの周期的処理(タイマ割込み)の使用を考えています。

しかし、実際にやってみるとエラーになって動きません。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "C:\Users\浩和\Documents\Python\test_timer.py", line 7, in <module> signal.signal(signal.SIGALRM, task) AttributeError: module 'signal' has no attribute 'SIGALRM'

該当のソースコード

import signal import time def task(arg1, arg2): print(time.time()) signal.signal(signal.SIGALRM, task) signal.setitimer(signal.ITIMER_REAL, 0.1, 0.1) while True: time.sleep(1)

試したこと

スペルチェックやwhile文の消去、復元

補足情報(FW/ツールのバージョンなど)

こちらのサイトを見ました。

https://qiita.com/miminashi/items/50a4f0906ab8f18b105d

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

以下のスクリプトでちゃんとした周期的処理ができます。
精度は高くないですが、処理の大きさに依存するという課題は払しょくできたように思います。

# -*- coding: utf-8 -*- import threading import time itv1 = 1 itv2 = 2 flg1 = False flg2 = False def proc1(): global itv1, t1, flg1 if flg1 : t1 = threading.Timer(itv1, proc1) t1.start() time.sleep(0.1) print(1) print(time.time()) def proc2(): global itv2, t2, flg2 if flg2 : t2 = threading.Timer(itv2, proc2) t2.start() time.sleep(0.2) print(2) print(time.time()) def main(): # 5秒後に実行 print(time.time()) global itv1, itv2, flg1, flg2 flg1 = True t1 = threading.Timer(itv1, proc1) t1.start() flg2 = True t2 = threading.Timer(itv2, proc2) t2.start() print("Start \n") time.sleep(10) flg1 = False flg2 = False time.sleep(5) print("End \n") if __name__ == '__main__': main()

以下、結果

1566719281.2299712 Start 1 1566719282.4357157 1 1566719283.4126706 2 1566719283.5546176 1 1566719284.4130106 1 1566719285.452437 2 1566719285.5183926 1 1566719286.4182339 1 1566719287.4101133 2 1566719287.5430822 1 1566719288.4095683 1 1566719289.4405668 2 1566719289.5115247 1 1566719290.4543476 1 1566719291.4061246 2 1566719291.534185 1 1566719292.4032955 2 1566719293.5416076 End

投稿2019/08/25 07:51

HiroPokeHero

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Windowsでは使えないようです
https://teratail.com/questions/93433

投稿2019/08/25 06:05

pea

総合スコア426

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HiroPokeHero

2019/08/25 06:38

ご連絡ありがとうございます。 また、添付のURLにWindowsでの方法も示されていますね。 今、確認したらできていそうでした。
HiroPokeHero

2019/08/25 06:46

さらに確認すると、 処理の大きさに依存してしまいますね。 1秒ごとの周期的処理の中に「0.1秒待つ」という処理を入れてみました。 すると、1.1秒の周期的処理になってしまいました。 処理の大きさに依存せずに周期的処理をすることは難しいのでしょうか?
pea

2019/08/25 06:56 編集

ここらへんにヒントはあるかもしれないです 自分もpythonのスレッド処理は実装したことはないのでネット漁る位しか出来ないです 検索できるようになれば大抵の答えはどっかにあります https://teratail.com/questions/99992
HiroPokeHero

2019/08/25 07:45

ご連絡ありがとうございます。 https://teratail.com/questions/99992 こちらの方法を使って、自身を呼び出すような関数にしてしまえばできそうです。 ただ、注意すべきは自信を呼び出す処理をその関数の先頭に持ってこないといけません。 そうしないと、結局0.1秒まってから1秒後に呼び出されるので、 1秒後に呼び出すという命令をしてから本来周期的にやりたかった処理をすればいい感じでした。
guest

0

AttributeError: 'signal'には'SIGALRM'というアトリビュートはありません。

ってことなんで、そこんところも一度確認してみては。

投稿2019/08/25 06:05

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

# -*- coding: utf-8 -*- import threading import time def log(text): print("{0}:{1}".format(text, time.time())) itv1 = 1 itv2 = 2 flg1 = False flg2 = False def proc1(): global itv1, t1, flg1 if flg1 : t1 = threading.Timer(itv1, proc1) t1.start() time.sleep(0.1) print(1) print(time.time()) def proc2(): global itv2, t2, flg2 if flg2 : t2 = threading.Timer(itv2, proc2) t2.start() time.sleep(0.2) print(2) print(time.time()) def main(): # 5秒後に実行 print(time.time()) global itv1, itv2, flg1, flg2 flg1 = True t1 = threading.Timer(itv1, proc1) t1.start() flg2 = True t2 = threading.Timer(itv2, proc2) t2.start() print("Start \n") time.sleep(10) flg1 = False flg2 = False time.sleep(5) print("End \n") if __name__ == '__main__': main()

投稿2019/08/25 07:46

HiroPokeHero

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問