Skip to content
Permalink
Browse files

service: don't acquire lock when pool already initialized

  • Loading branch information...
dw committed Feb 24, 2019
1 parent f4709b1 commit 50bfe4c74699c61d20076feaea16a8a9cc7b45e2
Showing with 18 additions and 13 deletions.
  1. +18 −13 mitogen/service.py
@@ -77,19 +77,24 @@ def func_name(func):
def get_or_create_pool(size=None, router=None):
global _pool
global _pool_pid
_pool_lock.acquire()
try:
if _pool_pid != os.getpid():
_pool = Pool(router, [], size=size or DEFAULT_POOL_SIZE,
overwrite=True)
# In case of Broker shutdown crash, Pool can cause 'zombie'
# processes.
mitogen.core.listen(router.broker, 'shutdown',
lambda: _pool.stop(join=False))
_pool_pid = os.getpid()
return _pool
finally:
_pool_lock.release()

my_pid = os.getpid()
if _pool is None or my_pid != _pool_pid:
# Avoid acquiring heavily contended lock if possible.
_pool_lock.acquire()
try:
if _pool_pid != my_pid:
_pool = Pool(router, [], size=size or DEFAULT_POOL_SIZE,
overwrite=True)
# In case of Broker shutdown crash, Pool can cause 'zombie'
# processes.
mitogen.core.listen(router.broker, 'shutdown',
lambda: _pool.stop(join=True))
_pool_pid = os.getpid()
finally:
_pool_lock.release()

return _pool


def call(service_name, method_name, call_context=None, **kwargs):

0 comments on commit 50bfe4c

Please sign in to comment.
You can’t perform that action at this time.