파이썬 함수 호출 질문입니다.

조회수 706회

시리얼 통신으로 데이터를 받아서, 값이 80이상인 데이터가 연속으로 5번 이상오면 url api를 사용하는 메신저로 알림을 보내는 코드입니다. 알림은 처음 알림이 발송된 후 에는 특정 시간이 경과한 후 전송하려고 합니다.

아래 코드에서 메신저로 알림을 보내는 것 까지는 성공 했습니다. 하지만, 30분의 시간을 두려 사용한 time.sleep 상태에서도 함수가 호출되어서 인지 아래 첨부한 사진 처럼 에러가 납니다.

알림 함수가 한번 호출 되고 난 다음에, 특정시간 동안 알림 함수 호출을 막는 방법은 없을까요?

import serial
import urllib2
import time
from threading import Thread

port = "/dev/ttyACM0"
baudrate=9600

api_key=''

Token=""
ChatId=""

count = 0
over=0

serial = serial.Serial(port,baudrate,timeout=80)
serial.flushInput()

def telegram(data):
      #telegram
      count=0
      t = 

urllib2.urlopen("https://api.telegram.org/bot"+Token+"/SendMessage? id="+str(ChatId)+"&text="+str(data))
      time.sleep(3600)
      count = 0

while True:
        t1=Thread(target=telegram,args=str(over))
        if serial.readable():
            input_s=serial.readline()
            rst=input_s[:-1].decode()
            print(rst)

            if int(rst) > 80 :
                count =count +1
            else :
                count = 0

            print(count)
            if(count>5) :
                over=int(rst)
                t1.start()

이미지

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • Thread 내부에서 sleep 함수를 호출한다고 해도 Main Thread는 계속해서 실행되어 while loop 내부에서 Thread를 계속해서 생성하기 때문에 의미가 없습니다. 오히려 이전에 생성했던 Thread가 sleep이 호출되어 종료되지 않은 상태로 새로운 Thread가 계속해서 생성되게 됩니다.

    간단하게는 Thread를 사용하지 않고 count가 5가 넘는 시점에 알림을 전송하는 함수를 호출하도록 하면 원하시는 대로 알림 delay를 구현할 수 있지만, 이 경우 sleep 하는 동안 serial input을 처리하지 못하게 됩니다.

    따라서 sleep을 사용하지 않고 알림을 보낸 시간을 기록하여 (현재시간 - 이전에 알림 보낸시간) 이 30분을 넘지 않으면 알림을 보내지 않게 로직을 구현하시는게 좀 더 좋은 해결책이 되실 겁니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)