Merge pull request #1073 from fabianvf/fix-py3-hang

Cleanup ThreadPool with atexit rather than __del__

(cherry picked from commit 0976d59d6f)
This commit is contained in:
Kubernetes Prow Robot 2020-02-10 14:07:54 -08:00 committed by Fabian von Feilitzsch
parent 08ccf9e0b7
commit 5aa41939cc
2 changed files with 36 additions and 1 deletions

View File

@ -10,6 +10,7 @@
from __future__ import absolute_import
import atexit
import datetime
import json
import mimetypes
@ -77,11 +78,19 @@ class ApiClient(object):
# Set default User-Agent.
self.user_agent = 'OpenAPI-Generator/11.0.0b2/python'
def __del__(self):
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
self.close()
def close(self):
if self._pool:
self._pool.close()
self._pool.join()
self._pool = None
if hasattr(atexit, 'unregister'):
atexit.unregister(self.close)
@property
def pool(self):
@ -89,6 +98,7 @@ class ApiClient(object):
avoids instantiating unused threadpool for blocking clients.
"""
if self._pool is None:
atexit.register(self.close)
self._pool = ThreadPool(self.pool_threads)
return self._pool

View File

@ -0,0 +1,25 @@
# coding: utf-8
import atexit
import weakref
import unittest
import kubernetes
class TestApiClient(unittest.TestCase):
def test_context_manager_closes_threadpool(self):
with kubernetes.client.ApiClient() as client:
self.assertIsNotNone(client.pool)
pool_ref = weakref.ref(client._pool)
self.assertIsNotNone(pool_ref())
self.assertIsNone(pool_ref())
def test_atexit_closes_threadpool(self):
client = kubernetes.client.ApiClient()
self.assertIsNotNone(client.pool)
self.assertIsNotNone(client._pool)
atexit._run_exitfuncs()
self.assertIsNone(client._pool)