2014-01-05 88 views
0

我有以下的代碼,而比較的日期時間一段時間後掛起。以下是我的代碼。代碼一段時間後掛斷了電話,而比較的日期時間

def worker(): 
flag = True 
while True: 
    s1 = '101:35:00' 
    e1 = '101:36:00' 
    s2 = '101:37:00' 
    e2 = '101:38:00' 
    s3 = '101:39:00' 
    e3 = '101:40:00' 

    if int(s1[0]) == 1: 
     start1 = str(datetime.datetime.now().date()) + ' ' + s1[1:9] 
    else: 
     start1 = str(datetime.datetime.now().date() + datetime.timedelta(days=1)) + ' ' + s1[1:9] 

    if int(s2[0]) == 1: 
     start2 = str(datetime.datetime.now().date()) + ' ' + s2[1:9] 
    else: 
     start2 = str(datetime.datetime.now().date() + datetime.timedelta(days=1)) + ' ' + s2[1:9] 

    if int(s3[0]) == 1: 
     start3 = str(datetime.datetime.now().date()) + ' ' + s3[1:9] 
    else: 
     start3 = str(datetime.datetime.now().date() + datetime.timedelta(days=1)) + ' ' + s3[1:9] 

    if int(e1[0]) == 1: 
     end1 = str(datetime.datetime.now().date()) + ' ' + e1[1:9] 
    else: 
     end1 = str(datetime.datetime.now().date() + datetime.timedelta(days=1)) + ' ' + e1[1:9] 

    if int(e2[0]) == 1: 
     end2 = str(datetime.datetime.now().date()) + ' ' + e2[1:9] 
    else: 
     end2 = str(datetime.datetime.now().date() + datetime.timedelta(days=1)) + ' ' + e2[1:9] 

    if int(e3[0]) == 1: 
     end3 = str(datetime.datetime.now().date()) + ' ' + e3[1:9] 
    else: 
     end3 = str(datetime.datetime.now().date() + datetime.timedelta(days=1)) + ' ' + e3[1:9] 

    s1t = datetime.datetime.strptime(start1, '%Y-%m-%d %H:%M:%S') 
    s2t = datetime.datetime.strptime(start2, '%Y-%m-%d %H:%M:%S') 
    s3t = datetime.datetime.strptime(start3, '%Y-%m-%d %H:%M:%S') 
    e1t = datetime.datetime.strptime(end1, '%Y-%m-%d %H:%M:%S') 
    e2t = datetime.datetime.strptime(end2, '%Y-%m-%d %H:%M:%S') 
    e3t = datetime.datetime.strptime(end3, '%Y-%m-%d %H:%M:%S') 

    cur = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') 
    curr = datetime.datetime.strptime(cur, '%Y-%m-%d %H:%M:%S') 

    if e1t < curr <= s2t or e2t < curr <= s3t: 
     flag = False 

    else: pass 

    while not flag: 
     print 'iwashereghgj' 
     print str(curr) #line1 
     if s2t <= curr < e2t or s3t <= curr < e3t:   
      q1.put(True) 

      flag = True 
     else: 
      flag = True 

例如在這種情況下,代碼只是在curr在'line1'達到'2014-01-06 01:37:00'後掛起。任何人都可以幫我解釋爲什麼會發生這種情況?

+1

請解決您的壓痕 – MattDMo

+0

你'而TRUE'循環沒有休息'/返回/ raise',所以你怎麼指望它逃脫循環? – shx2

+0

但我的問題是爲什麼代碼在2分鐘後掛起#line1? – prattom

回答

3

所有這些重複使調試你的代碼非常困難。先從一些封裝:

def process_time(timestring): 
    today = datetime.date.today() 
    tomorrow = today + datetime.timedelta(days=1) 
    h, m, s = map(int, timestring[1:9].split(':')) 
    time = datetime.time(hour=h, minute=m, second=s) 
    if timestring[0] == '1': 
     return datetime.datetime.combine(today, time) 
    return datetime.datetime.combine(tomorrow, time) 

現在很清楚的功能究竟是幹什麼,你可以直接跳到

s1t = process_time(s1) # and so on 

加上它感覺就像你可以縮短

cur = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') 
curr = datetime.datetime.strptime(cur, '%Y-%m-%d %H:%M:%S') 

curr = datetime.datetime.now() 

至於你的問題,就是你不會在你的循環中更新curr,所以它仍然是你開始執行任務的時間。您需要繼續檢查當前的時間。

要實現:

# process time strings once, outside loop 
timeslots = [(s1t, e1t), ...] 
while True: 
## starting = True 
    while any(s <= datetime.datetime.now() < e for s, e in timeslots): 
##  if starting: 
##   print("Starting:", datetime.datetime.now()) 
##   starting = False 
     q1.put(True) # do task in timeslots 
    if all(datetime.datetime.now() >= e for s, e in timeslots): 
##  print("All timeslots done:", datetime.datetime.now()) 
     break 
# whatever happens afterwards 

注:線開始##是用於演示目的,請註釋掉的 「生產」 中使用。

+0

感謝您清理我的代碼。 – prattom

+0

@ user2673943:避免周圍DST破損,可以使用UTC時間:'今天= datetime.utcnow()日期()','CURR = datetime.utcnow()''假設從日期時間進口datetime'。 – jfs