Ich habe eine Anwendung, die eine Reihe von Servern alle paar Minuten abfragt. Um dies zu tun, laicht es ein Thread pro Server abzufragen (15 Server) und schreibt die Daten in ein Objekt zurück:Ausgabe Grund für Python Absturz
import requests
class ServerResults(object):
def __init__(self):
self.results = []
def add_server(some_argument):
self.results.append(some_argument)
servers = ['1.1.1.1', '1.1.1.2']
results = ServerResults()
for s in servers:
t = CallThreads(poll_server, s, results)
t.daemon = True
t.start()
def poll_server(server, results):
response = requests.get(server, timeout=10)
results.add_server(response.status_code);
Die CallThreads
Klasse ist eine Hilfsfunktion, eine Funktion (in diesem Fall poll_server()
mit Argumenten nennen (in diesem Fall s
und results
), können Sie die Quelle bei meinem Github Repo von Python utility functions sehen.Der Großteil der Zeit funktioniert das gut, aber manchmal ein Thread intermittierend hängt.Ich bin mir nicht sicher, warum, da ich a . Timeout auf der Anforderung GET In jedem Fall, wenn der Faden aufbauen hängt dann die aufgehängten Fäden im Laufe von Stunden oder Tagen, und dann stürzt Python:
File "/usr/lib/python2.7/threading.py", line 495, in start
_start_new_thread(self.__bootstrap,())
thread.error: can't start new thread
Exception in thread Thread-575 (most likely raised during interpreter shutdown)
Exception in thread Thread-1671 (most likely raised during interpreter shutdown)
Exception in thread Thread-831 (most likely raised during interpreter shutdown)
Wie könnte ich damit umgehen? Es scheint killablockingthreadinPython keine Möglichkeit zu sein. Diese Anwendung muss auf einem Raspberry Pi laufen, so dass große Bibliotheken wie twisted nicht passen, in der Tat muss ich die requests Bibliothek auch loswerden!
Erstens, ist dies auf einem Pi, wenn es hängt, oder testen Sie woanders? Möglicherweise gibt es plattformspezifische Tools, mit denen Sie sehen können, was der Thread tut, aber Sie haben Ihre Plattform nicht angegeben. – Useless
Zweitens, was ist "Anfragen"?Ohne das zu sehen, ist es unmöglich zu sagen, ob es dort eine Race Condition gibt – Useless
Drittens, auch wenn Sie nicht verdreht verwenden, ist synchrone blockierungsfreie I/O in einem einzigen Thread viel besser skalierbar als diese – Useless