Python线程,线程不关闭

Oss*_*ama 5 python multithreading

我有一个Python程序,当我退出应用程序时 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()
Run Code Online (Sandbox Code Playgroud)

为什么python线程不关闭Ctrl+c

GP8*_*P89 5

您需要使该线程成为守护程序线程.为此,在调用Thread的init之后添加以下行

self.setDaemon(True)
Run Code Online (Sandbox Code Playgroud)

当只有守护程序线程处于活动状态时,程序将退出,主线程当然是非守护进程

  • 首选拼写是"self.daemon = True" (3认同)
  • 摘要不正确.如果您生成一个守护程序线程X和一个非守护程序线程Y并退出主线程M,则守护程序线程X将*不会死亡. - "守护程序线程不会阻止程序退出"是一种更正确的措辞. (2认同)
  • 你是对的,谢谢!我编辑了我的答案 - 我的理解是关闭的 (2认同)
  • @GP89:你的观点很有道理。但是,2.7 文档[描述](http://docs.python.org/library/threading.html#threading.Thread.setDaemon) `setDaemon` 为“守护进程的旧 API”。3.3 文档[说](http://docs.python.org/dev/library/threading.html#threading.Thread.setDaemon)“守护进程的旧 getter/setter API;直接将其用作属性。” 因此,当我说优先使用它作为属性时,我是在解释文档。 (2认同)