mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
[3.12] gh-120868: Fix breaking change in logging.config
when using QueueHandler
(GH-120872) (GH-121077)
(cherry picked from commit 7d9c68513d
)
This commit is contained in:
parent
8ea6cc14a5
commit
b31f7e2e90
3 changed files with 82 additions and 17 deletions
|
@ -787,25 +787,44 @@ class DictConfigurator(BaseConfigurator):
|
|||
# if 'handlers' not in config:
|
||||
# raise ValueError('No handlers specified for a QueueHandler')
|
||||
if 'queue' in config:
|
||||
from multiprocessing.queues import Queue as MPQueue
|
||||
from multiprocessing import Manager as MM
|
||||
proxy_queue = MM().Queue()
|
||||
proxy_joinable_queue = MM().JoinableQueue()
|
||||
qspec = config['queue']
|
||||
if not isinstance(qspec, (queue.Queue, MPQueue,
|
||||
type(proxy_queue), type(proxy_joinable_queue))):
|
||||
if isinstance(qspec, str):
|
||||
q = self.resolve(qspec)
|
||||
if not callable(q):
|
||||
raise TypeError('Invalid queue specifier %r' % qspec)
|
||||
q = q()
|
||||
elif isinstance(qspec, dict):
|
||||
if '()' not in qspec:
|
||||
raise TypeError('Invalid queue specifier %r' % qspec)
|
||||
q = self.configure_custom(dict(qspec))
|
||||
else:
|
||||
|
||||
if isinstance(qspec, str):
|
||||
q = self.resolve(qspec)
|
||||
if not callable(q):
|
||||
raise TypeError('Invalid queue specifier %r' % qspec)
|
||||
config['queue'] = q
|
||||
config['queue'] = q()
|
||||
elif isinstance(qspec, dict):
|
||||
if '()' not in qspec:
|
||||
raise TypeError('Invalid queue specifier %r' % qspec)
|
||||
config['queue'] = self.configure_custom(dict(qspec))
|
||||
else:
|
||||
from multiprocessing.queues import Queue as MPQueue
|
||||
|
||||
if not isinstance(qspec, (queue.Queue, MPQueue)):
|
||||
# Safely check if 'qspec' is an instance of Manager.Queue
|
||||
# / Manager.JoinableQueue
|
||||
|
||||
from multiprocessing import Manager as MM
|
||||
from multiprocessing.managers import BaseProxy
|
||||
|
||||
# if it's not an instance of BaseProxy, it also can't be
|
||||
# an instance of Manager.Queue / Manager.JoinableQueue
|
||||
if isinstance(qspec, BaseProxy):
|
||||
# Sometimes manager or queue creation might fail
|
||||
# (e.g. see issue gh-120868). In that case, any
|
||||
# exception during the creation of these queues will
|
||||
# propagate up to the caller and be wrapped in a
|
||||
# `ValueError`, whose cause will indicate the details of
|
||||
# the failure.
|
||||
mm = MM()
|
||||
proxy_queue = mm.Queue()
|
||||
proxy_joinable_queue = mm.JoinableQueue()
|
||||
if not isinstance(qspec, (type(proxy_queue), type(proxy_joinable_queue))):
|
||||
raise TypeError('Invalid queue specifier %r' % qspec)
|
||||
else:
|
||||
raise TypeError('Invalid queue specifier %r' % qspec)
|
||||
|
||||
if 'listener' in config:
|
||||
lspec = config['listener']
|
||||
if isinstance(lspec, type):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue