回答編集履歴

2

追記

2018/04/17 13:21

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -12,11 +12,11 @@
12
12
 
13
13
  # ++++ モジュール ++++
14
14
 
15
- import threading
15
+ from threading import Thread
16
16
 
17
17
  from datetime import datetime, timedelta
18
18
 
19
- import sched
19
+ from sched import scheduler
20
20
 
21
21
  import time
22
22
 
@@ -28,39 +28,53 @@
28
28
 
29
29
  def __init__(self):
30
30
 
31
- self.scheduler = sched.scheduler(time.time, time.sleep)
31
+ self.scheduler = scheduler(time.time, time.sleep)
32
32
 
33
33
  # 3秒間隔
34
34
 
35
- self.delay = timedelta(seconds=3)
35
+ self.interval = timedelta(seconds=3)
36
36
 
37
+ # 1日間隔
38
+
37
- #self.delay = timedelta(days=1)
39
+ #self.interval = timedelta(days=1)
38
40
 
39
41
 
40
42
 
41
43
  def what_garbage_day(self):
42
44
 
45
+ """
46
+
47
+ 指定時間に動作する関数
48
+
49
+ """
50
+
43
51
  print("今日は何のゴミの日")
44
52
 
45
53
  # 次のスケジュールを登録
46
54
 
47
- self.scheduler.enter(self.delay.total_seconds(), 1, self.what_garbage_day)
55
+ self.scheduler.enter(self.interval.total_seconds(), 1, self.what_garbage_day)
48
56
 
49
57
  #print(self.scheduler.queue)
50
58
 
51
- # 指定時間に動作する関数
59
+
52
60
 
53
61
  def specified_time(self):
62
+
63
+ """
64
+
65
+ スケジューラーに予定を登録し実行する。
66
+
67
+ """
54
68
 
55
69
  now = datetime.now()
56
70
 
57
71
  # call_time の設定
58
72
 
59
- run = now.replace(hour=2, minute=30, second=50, microsecond=0)
73
+ run = now.replace(hour=22, minute=12, second=30, microsecond=0)
60
74
 
61
75
  if now > run:
62
76
 
63
- # クを登録時に時間が経過していたら次の日に
77
+ # スケジュール登録時に時間が経過していたら次の日に
64
78
 
65
79
  run += timedelta(days=1)
66
80
 
@@ -84,7 +98,7 @@
84
98
 
85
99
  # スレッドで指定時間動作関数を動かす
86
100
 
87
- t = threading.Thread(target=garbageDayReminder.specified_time)
101
+ t = Thread(target=garbageDayReminder.specified_time)
88
102
 
89
103
  t.start()
90
104
 
@@ -110,10 +124,12 @@
110
124
 
111
125
  ```
112
126
 
113
- 上記コードはscheduler.enterを使っているため、厳密にはprint文とメソッド呼び出し遅延します。
127
+ 上記コードはscheduler.enterを使っているため、指定時間の呼び出しがミリ秒単位で遅延し累積します。(※)
128
+
129
+ ※what_garbage_day関数の処理に掛かる時間とタイマーの精度の問題です。
114
130
 
115
131
  質問文の要件として、そこまで頻繁に呼び出さないタスクだと思われたためこの実装にしましたが。
116
132
 
117
- 問題があるのでしたら、enterabsを使った形に修正してくださいな。
133
+ 問題があるのでしたら、scheduler.enterabsを使った形に修正してくださいな。
118
134
 
119
135
  ```

1

追記

2018/04/17 13:21

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -19,12 +19,6 @@
19
19
  import sched
20
20
 
21
21
  import time
22
-
23
-
24
-
25
- # ++++ グローバル変数 +++++
26
-
27
- call_time = "01:50:50"
28
22
 
29
23
 
30
24
 
@@ -52,25 +46,17 @@
52
46
 
53
47
  self.scheduler.enter(self.delay.total_seconds(), 1, self.what_garbage_day)
54
48
 
49
+ #print(self.scheduler.queue)
50
+
55
51
  # 指定時間に動作する関数
56
52
 
57
53
  def specified_time(self):
58
54
 
59
- # 変数
60
-
61
- format_day = "%Y/%m/%d-"
62
-
63
- format_time = "%H:%M:%S"
64
-
65
55
  now = datetime.now()
66
56
 
67
- # format_timeだと日付が1990-1-1になるため現在日付を代入する
57
+ # call_time 設定
68
58
 
69
- now_date = now.strftime(format_day)
70
-
71
- # 指定時間を代入する
72
-
73
- run = datetime.strptime(now_date + call_time, format_day + format_time)
59
+ run = now.replace(hour=2, minute=30, second=50, microsecond=0)
74
60
 
75
61
  if now > run:
76
62
 
@@ -112,4 +98,22 @@
112
98
 
113
99
  main()
114
100
 
101
+
102
+
115
103
  ```
104
+
105
+ ◇参考情報
106
+
107
+ [sched.scheduler.enter](https://docs.python.jp/3/library/sched.html#sched.scheduler.enter)
108
+
109
+
110
+
111
+ ```
112
+
113
+ 上記コードはscheduler.enterを使っているため、厳密にはprint文とメソッド呼び出し文遅延します。
114
+
115
+ 質問文の要件として、そこまで頻繁に呼び出さないタスクだと思われたためこの実装にしましたが。
116
+
117
+ 問題があるのでしたら、enterabsを使った形に修正してくださいな。
118
+
119
+ ```