У меня есть приложение, которое каждые несколько минут проверяет группу серверов. Чтобы сделать это, он запускает один поток на сервер опрос (15 серверов) и записывает обратно данные к объекту:Причина выхода из строя Python
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);
CallThreads
класса является вспомогательной функцией для вызова функции (в данном случае poll_server()
с аргументами (в этом случае s
и results
), вы можете увидеть источник в моем реестре Github от Python utility functions. В большинстве случаев это работает нормально, однако иногда поток прерывисто висит. Я не уверен, почему, поскольку я использую timeout в запросе GET. В любом случае, если поток зависает, то зависающие потоки накапливаются в течение часов или дней, а затем сбой 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)
Как я могу справиться с этим? Кажется, нет никакого пути к killablockingthreadinPython. Это приложение должно работать на малине Pi, поэтому большие библиотеки, такие как twisted, не подходят, на самом деле мне также нужно избавиться от библиотеки requests!
Во-первых, это на пи, когда он висит, или вы проводите тестирование в другом месте? Могут быть инструменты для конкретной платформы, которые помогут увидеть, что делает поток, но вы не указали свою платформу. – Useless
Во-вторых, что такое 'запросы'?Не видя этого, невозможно сказать, есть ли в нем состояние гонки – Useless
В-третьих, даже если вы не используете скрученный, синхронный неблокирующий ввод-вывод в одном потоке гораздо более масштабируемый, чем этот – Useless