我有一个Python程序,当我使用退出应用程序时 Ctrl-c,脚本不会关闭。我的过程仍显示在运行的过程中。
Ctrl-c
#!/usr/bin/env python import socket import threading import Queue import serial import mysql.connector from datetime import datetime, date, time host = '0.0.0.0' port = 1024 buffer = 102400 my_queue = Queue.Queue() class readFromUDPSocket(threading.Thread): def __init__(self, my_queue): threading.Thread.__init__(self) self.my_queue = my_queue def run(self): while True: buffer1,addr = socketUDP.recvfrom(buffer) self.my_queue.put(buffer1) print 'UDP received' class readFromSerial(threading.Thread): def __init__(self, my_queue): threading.Thread.__init__(self) self.my_queue = my_queue def run(self): while True: buffer2 = ser.readline(eol=';') if buffer2: self.my_queue.put(buffer2) print 'Serial received' class process(threading.Thread): def __init__(self, my_queue): threading.Thread.__init__(self) self.my_queue = my_queue self.alive = threading.Event() self.alive.set() def run(self): while True: buffer3 = self.my_queue.get() today = datetime.now() timestamp = today.strftime("%A, %B %d, %Y %H:%M:%S") print 'Data pushed at:', timestamp print buffer3 if buffer3.startswith('temp:'): temp = buffer3.replace('temp:','') cnx = mysql.connector.connect(user='root', password='xxxxx', database='temperature') cursor = cnx.cursor() cursor.execute("INSERT INTO temperature.temperature (time,temperature) VALUES (%s, %s)", [timestamp, temp]) print 'Data inserted into Database' cnx.commit() cursor.close() cnx.close() if __name__ == '__main__': # Create socket (IPv4 protocol, datagram (UDP)) and bind to address socketUDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) socketUDP.bind((host, port)) ser = serial.Serial('/dev/ttyUSB0', 57600, timeout=2) # Instantiate & start threads myServer = readFromUDPSocket(my_queue) mySerial = readFromSerial(my_queue) myDisplay = process(my_queue) myServer.start() myDisplay.start() mySerial.start() while 1: pass UDPSock.close() ser.close()
为什么python线程不能关闭Ctrl+c?
Ctrl+c
您需要将该线程设为守护程序线程。为此,请在调用线程的init之后添加以下行
self.setDaemon(True)
当只有守护程序线程处于活动状态时,程序将退出,主线程当然是非守护程序的