mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	gh-119819: Fix regression to allow logging configuration with multipr… (GH-120030)
This commit is contained in:
		
							parent
							
								
									dce14bb2dc
								
							
						
					
					
						commit
						99d945c0c0
					
				
					 3 changed files with 31 additions and 1 deletions
				
			
		|  | @ -781,8 +781,10 @@ def configure_handler(self, 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() | ||||
|                     qspec = config['queue'] | ||||
|                     if not isinstance(qspec, (queue.Queue, MPQueue)): | ||||
|                     if not isinstance(qspec, (queue.Queue, MPQueue, type(proxy_queue))): | ||||
|                         if isinstance(qspec, str): | ||||
|                             q = self.resolve(qspec) | ||||
|                             if not callable(q): | ||||
|  |  | |||
|  | @ -3926,6 +3926,32 @@ def test_config_queue_handler(self): | |||
|             msg = str(ctx.exception) | ||||
|             self.assertEqual(msg, "Unable to configure handler 'ah'") | ||||
| 
 | ||||
|     @unittest.skipIf(support.is_wasi, "WASI does not have multiprocessing.") | ||||
|     def test_multiprocessing_queues(self): | ||||
|         # See gh-119819 | ||||
|         cd = copy.deepcopy(self.config_queue_handler) | ||||
|         from multiprocessing import Queue as MQ, Manager as MM | ||||
|         q1 = MQ()  # this can't be pickled | ||||
|         q2 = MM().Queue()  # a proxy queue for use when pickling is needed | ||||
|         for qspec in (q1, q2): | ||||
|             fn = make_temp_file('.log', 'test_logging-cmpqh-') | ||||
|             cd['handlers']['h1']['filename'] = fn | ||||
|             cd['handlers']['ah']['queue'] = qspec | ||||
|             qh = None | ||||
|             try: | ||||
|                 self.apply_config(cd) | ||||
|                 qh = logging.getHandlerByName('ah') | ||||
|                 self.assertEqual(sorted(logging.getHandlerNames()), ['ah', 'h1']) | ||||
|                 self.assertIsNotNone(qh.listener) | ||||
|                 self.assertIs(qh.queue, qspec) | ||||
|                 self.assertIs(qh.listener.queue, qspec) | ||||
|             finally: | ||||
|                 h = logging.getHandlerByName('h1') | ||||
|                 if h: | ||||
|                     self.addCleanup(closeFileHandler, h, fn) | ||||
|                 else: | ||||
|                     self.addCleanup(os.remove, fn) | ||||
| 
 | ||||
|     def test_90195(self): | ||||
|         # See gh-90195 | ||||
|         config = { | ||||
|  |  | |||
|  | @ -0,0 +1,2 @@ | |||
| Fix regression to allow logging configuration with multiprocessing queue | ||||
| types. | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Vinay Sajip
						Vinay Sajip