Python threading-threads nicht schließen
Habe ich ein Python-Programm, und wenn ich die Anwendung beenden mit Strg-c, das Skript nicht in der Nähe. Mein Prozess zeigt immer noch in die Laufenden Prozesse.
#!/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()
Warum die python-thread nicht schließen mit Strg+c?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du brauchst, um den thread ein daemon-thread. Um dies zu tun fügen Sie die folgende Zeile nach dem Aufruf der Thread init
Programm wird beendet, wenn nur noch daemon-threads übrigbleiben, die Haupt-thread ist nicht-dämonischen natürlich
self.daemon = True
AttributeError
, wenn Sie Zauberself.daemon
falsch, erhalten Sie keine Fehlermeldung und die nicht-daemonised-thread, den Sie denken, ist daemonised, und einige unerwünschte bugssetDaemon
als "Alte API für daemon". Die 3.3 docs sagen "Alte getter - /setter-API für daemon; verwenden Sie es direkt als eine Eigenschaft, statt." Also, wenn ich sage, dass Sie es als eine Eigenschaft, wird bevorzugt, ich bin Umschreibung der Dokumente.the_thread.setDaemon(true)
finden Sie http://docs.python.org/library/threading.html#threading.Thread.daemonthe_thread.daemon = True
War ich nicht in der Lage zu töten, meine python-sub-Prozess, da hatte ich die
shell=True
option in derprocess.Popen
Befehl. Ich entfernte shell=True und dann konnte ich es töten.Wenn der Unterprozess ist eine shell, dann haben Sie zu töten die Dinge, die er ausgeführt wird, bevor die shell Ende selbst.