Skip to content

Commit 50bfe4c

Browse files
committed
service: don't acquire lock when pool already initialized
1 parent f4709b1 commit 50bfe4c

File tree

1 file changed

+18
-13
lines changed

1 file changed

+18
-13
lines changed

mitogen/service.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -77,19 +77,24 @@ def func_name(func):
7777
def get_or_create_pool(size=None, router=None):
7878
global _pool
7979
global _pool_pid
80-
_pool_lock.acquire()
81-
try:
82-
if _pool_pid != os.getpid():
83-
_pool = Pool(router, [], size=size or DEFAULT_POOL_SIZE,
84-
overwrite=True)
85-
# In case of Broker shutdown crash, Pool can cause 'zombie'
86-
# processes.
87-
mitogen.core.listen(router.broker, 'shutdown',
88-
lambda: _pool.stop(join=False))
89-
_pool_pid = os.getpid()
90-
return _pool
91-
finally:
92-
_pool_lock.release()
80+
81+
my_pid = os.getpid()
82+
if _pool is None or my_pid != _pool_pid:
83+
# Avoid acquiring heavily contended lock if possible.
84+
_pool_lock.acquire()
85+
try:
86+
if _pool_pid != my_pid:
87+
_pool = Pool(router, [], size=size or DEFAULT_POOL_SIZE,
88+
overwrite=True)
89+
# In case of Broker shutdown crash, Pool can cause 'zombie'
90+
# processes.
91+
mitogen.core.listen(router.broker, 'shutdown',
92+
lambda: _pool.stop(join=True))
93+
_pool_pid = os.getpid()
94+
finally:
95+
_pool_lock.release()
96+
97+
return _pool
9398

9499

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

0 commit comments

Comments
 (0)