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:
parent
df6fdd2250
commit
59f4bfdd4b
@ -14,6 +14,7 @@ from __future__ import absolute_import
|
||||
import os
|
||||
import re
|
||||
import json
|
||||
import atexit
|
||||
import mimetypes
|
||||
import tempfile
|
||||
from multiprocessing.pool import ThreadPool
|
||||
@ -74,12 +75,20 @@ class ApiClient(object):
|
||||
self.cookie = cookie
|
||||
# Set default User-Agent.
|
||||
self.user_agent = 'Swagger-Codegen/10.0.1/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):
|
||||
@ -87,6 +96,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
|
||||
|
||||
|
||||
25
kubernetes/test/test_api_client.py
Normal file
25
kubernetes/test/test_api_client.py
Normal 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)
|
||||
Loading…
Reference in New Issue
Block a user