[Python] Timer loop 에 대한 고찰 Develop Tip

아주 흔한 loop의 경우 1초마다 무엇인가를 할 경우가 있습니다.

제일 간단한 케이스로 아래와 같이 loop을 돌려봅니다.

import datetime

count = 0
s_ts = datetime.datetime.now()
while True:
count += 1
e_ts = datetime.datetime.now()
diff_ts = e_ts - s_ts
if diff_ts.total_seconds() >= 1:
break
print 'num loop in 1-second now() count = %d' % count

그러면 그 결과가,

num loop in 1-second now() count = 210879

와 같이 나왔습니다.
즉, count 뿐만 아니라 datetime.datetime.now() 현재 시각 호출 자체의
시간이 꽤 많이 나옴을 알 수 있습니다.

이것을 다음과 같이 수정했습니다.

from threading import Thread

import time
class MyThread(Thread):
def __init__(self, pobj):
self.stopped = False
self.pobj = pobj
Thread.__init__(self)
def run(self):
while not self.stopped:
# call a function
time.sleep(1.0)
self.pobj.loop_break = True
def stop(self):
self.stopped = True

class MyLoop(object):
def __init__(self):
self.count = 0
self.loop_break = False
self.myt = MyThread(self)
self.myt.start()
def __del__(self):
self.close()
def close(self):
if self.myt is not None:
self.myt.stop()
self.myt.join()
self.myt = None
def loop(self):
self.count = 0
#s_ts = datetime.datetime.now()
while not self.loop_break:
self.count += 1
self.loop_break = False
print 'num loop in 1-second now() count = %d' % self.count

myl = MyLoop()
myl.loop()
myl.loop()
myl.loop()
myl.close()


위에서는 1초가 넘으면 플래그를 설정하는 별도의 쓰레드 (MyThread)를 만들어
그 안에서  blocking sleep 을 하고 메인에서는 count += 1 작업을 계속 하는 것이지요.

그랬더니,

num loop in 1-second now() count = 5710035
num loop in 1-second now() count = 5737260
num loop in 1-second now() count = 5743017

위와 같이 27배 정도의 차이가 발생했습니다.

즉, timer에 의한 loop 작업을 할 경우에는 아래와 같이 하는게 더 효율적 이겠죠?
(C도 마찬가지라 생각됩니다)

누군가는 도움이 되셨기를...

덧글

  • 2015/07/29 13:51 # 삭제 답글

    잘 이해가 되지 않는 부분이 왜 아래가 더 효율적인건가요?
    1초안에 카운트가 위에는 1이라고 하면 아래는 27인건데...타이머를 더 잘게 나눠쓸수있다는 측면에서 아래코드가 더 효율적이라는 건가요?
  • HAMA 2016/06/24 10:47 # 삭제 답글

    이 코드는 오류가 있어보이네요.

    My 쓰레드에서 true 해줘도 메인 쓰레드에서 바로 false 로 덮는 문제로 1초 이상 계산할 여지가 큼니다.
댓글 입력 영역

구글애드텍스트