У меня есть долго работающая программа, которая периодически подключается к внешним сетевым ресурсам. Я завернул эти вызовы в поток тайм-аута, поэтому, если вызов занимает более 10 секунд, вызов немедленно возвращает ошибку, например:
def fetch_resource(url):
class TimeoutThread(Thread):
def __init__(self):
Thread.__init__(self)
self.result = None
def run(self):
self.result = requests.get(url)
tt = TimeoutThread()
tt.start()
tt.join(10.0)
if tt.result:
return tt.result.content
else:
return None
Однако, читая документацию Thread, кажется, что Thread.join()
вернет либо:
- Когда поток завершается или
- через 10 секунд
В случае, когда .join()
возвращается через 10 секунд, поток все еще жив, верно? Я понимаю, что нет хороших способов убить поток, но как я могу гарантировать, что поток в конечном итоге завершится и будет собран мусор? Я беспокоюсь, что потоки могут зависнуть и никогда не вернуться, таким образом, постепенно съедая ресурсы, которые никогда не освобождаются.
self.result = requests.get(url)
. Так что нет, дело не в цикле. - person Chris B.   schedule 03.02.2012