- 작성시간 : 2013/06/04 16:56
- 퍼머링크 : mcchae.egloos.com/11026851
- 덧글수 : 2
아주 흔한 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도 마찬가지라 생각됩니다)
누군가는 도움이 되셨기를...
덧글
1초안에 카운트가 위에는 1이라고 하면 아래는 27인건데...타이머를 더 잘게 나눠쓸수있다는 측면에서 아래코드가 더 효율적이라는 건가요?
My 쓰레드에서 true 해줘도 메인 쓰레드에서 바로 false 로 덮는 문제로 1초 이상 계산할 여지가 큼니다.