Skip to content

Commit 59f4bfd

Browse files
k8s-ci-robotfabianvf
authored andcommitted
Merge pull request kubernetes-client#1073 from fabianvf/fix-py3-hang
Cleanup ThreadPool with atexit rather than __del__ (cherry picked from commit 0976d59)
1 parent df6fdd2 commit 59f4bfd

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

kubernetes/client/api_client.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import os
1515
import re
1616
import json
17+
import atexit
1718
import mimetypes
1819
import tempfile
1920
from multiprocessing.pool import ThreadPool
@@ -74,19 +75,28 @@ def __init__(self, configuration=None, header_name=None, header_value=None,
7475
self.cookie = cookie
7576
# Set default User-Agent.
7677
self.user_agent = 'Swagger-Codegen/10.0.1/python'
77-
78-
def __del__(self):
78+
79+
def __enter__(self):
80+
return self
81+
82+
def __exit__(self, exc_type, exc_value, traceback):
83+
self.close()
84+
85+
def close(self):
7986
if self._pool:
8087
self._pool.close()
8188
self._pool.join()
8289
self._pool = None
90+
if hasattr(atexit, 'unregister'):
91+
atexit.unregister(self.close)
8392

8493
@property
8594
def pool(self):
8695
"""Create thread pool on first request
8796
avoids instantiating unused threadpool for blocking clients.
8897
"""
8998
if self._pool is None:
99+
atexit.register(self.close)
90100
self._pool = ThreadPool(self.pool_threads)
91101
return self._pool
92102

kubernetes/test/test_api_client.py

+25
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)