8000 Merge pull request #1073 from fabianvf/fix-py3-hang · kubernetes-client/python@5aa4193 · GitHub
[go: up one dir, main page]

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 5aa4193

Browse files
k8s-ci-robotfabianvf
authored andcommitted
Merge pull request #1073 from fabianvf/fix-py3-hang
Cleanup ThreadPool with atexit rather than __del__ (cherry picked from commit 0976d59)
1 parent 08ccf9e commit 5aa4193

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

kubernetes/client/api_client.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
from __future__ import absolute_import
1212

13+
import atexit
1314
import datetime
1415
import json
1516
import mimetypes
@@ -77,18 +78,27 @@ def __init__(self, configuration=None, header_name=None, header_value=None,
7778
# Set default User-Agent.
7879
self.user_agent = 'OpenAPI-Generator/11.0.0b2/python'
7980

80-
def __del__(self):
81+
def __enter__(self):
82+
return self
83+
84+
def __exit__(self, exc_type, exc_value, traceback):
85+
self.close()
86+
87+
def close(self):
8188
if self._pool:
8289
self._pool.close()
8390
self._pool.join()
8491
self._pool = None
92+
if hasattr(atexit, 'unregister'):
93+
atexit.unregister(self.close)
8594

8695
@property
8796
def pool(self):
8897
"""Create thread pool on first request
8998
avoids instantiating unused threadpool for blocking clients.
9099
"""
91100
if self._pool is None:
101+
atexit.register(self.close)
92102
self._pool = ThreadPool(self.pool_threads)
93103
return self._pool
94104

kubernetes/test/test_api_client.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# coding: utf-8
2+
3+
4+
import atexit
5+
import weakref
6+
import unittest
7+
8+
import kubernetes
9+
10+
11+
class TestApiClient(unittest.TestCase):
12+
13+
def test_context_manager_closes_threadpool(self):
14+
with kubernetes.client.ApiClient() as client:
15+
self.assertIsNotNone(client.pool)
16+
pool_ref = weakref.ref(client._pool)
17+
self.assertIsNotNone(pool_ref())
18+
self.assertIsNone(pool_ref())
19+
20+
def test_atexit_closes_threadpool(self):
21+
client = kubernetes.client.ApiClient()
22+
self.assertIsNotNone(client.pool)
23+
self.assertIsNotNone(client._pool)
24+
atexit._run_exitfuncs()
25+
self.assertIsNone(client._pool)

0 commit comments

Comments
 (0)
0