44import weakref
55
66from ast import Or
7- from collections import deque
87from functools import partial
9- from threading import Barrier , Event , Thread
8+ from threading import Barrier , Thread
109from unittest import TestCase
1110
1211try :
@@ -344,45 +343,38 @@ def test_racing_dict_update_and_method_lookup_with_inline_values(self):
344343 class Target :
345344 pass
346345
347- def appender (obj : Target , start : Barrier , stop : Event ) -> None :
346+ def appender (obj : Target , start : Barrier , iter_times : int ) -> None :
348347 start .wait ()
349348 index = 0
350- while not stop . is_set ( ):
349+ for _ in range ( iter_times ):
351350 setattr (obj , f"probe_{ index } " , index )
352351 index += 1
353352 time .sleep (0 )
354353
355- def replacer (obj : Target , start : Barrier , stop : Event ,
356- detached_dict_queue : deque [tuple [dict , frozenset ]]) -> None :
354+ def replacer (obj : Target , start : Barrier , iter_times : int ,
355+ detached_dict_queue : list [tuple [dict , frozenset ]]) -> None :
357356 start .wait ()
358- while not stop . is_set ( ):
357+ for _ in range ( iter_times ):
359358 dict_snapshot = obj .__dict__
360359 obj .__dict__ = {}
361360 current_keys = frozenset (dict_snapshot )
362361 detached_dict_queue .append ((dict_snapshot , current_keys ))
363362 time .sleep (0 )
364363
365- def start_race (start : Barrier , stop : Event , seconds : float ) -> None :
366- start .wait ()
367- time .sleep (seconds )
368- stop .set ()
369-
370- def race (seconds : float , appender_threads : int ,
364+ def race (iter_times : int , appender_threads : int ,
371365 replacer_threads : int ) -> None :
372366 obj = Target ()
373367 setattr (obj , "origin" , 0 )
374368 _ = obj .__dict__ # Access __dict__ to ensure it's initialized
375369
376- start = Barrier (appender_threads + replacer_threads + 1 )
377- stop = Event ()
378- detached_dict_queue : deque [tuple [dict , frozenset ]] = deque ()
379- threads = [Thread (target = start_race , args = (start , stop , seconds ),
380- name = "starter" )]
370+ start = Barrier (appender_threads + replacer_threads )
371+ detached_dict_queue : list [tuple [dict , frozenset ]] = []
372+ threads = []
381373 for _ in range (appender_threads ):
382- threads .append (Thread (target = appender , args = (obj , start , stop ),
374+ threads .append (Thread (target = appender , args = (obj , start , iter_times ),
383375 name = "appender" ))
384376 for _ in range (replacer_threads ):
385- threads .append (Thread (target = replacer , args = (obj , start , stop , detached_dict_queue ),
377+ threads .append (Thread (target = replacer , args = (obj , start , iter_times , detached_dict_queue ),
386378 name = "replacer" ))
387379
388380 with threading_helper .start_threads (threads ):
@@ -393,10 +385,10 @@ def race(seconds: float, appender_threads: int,
393385 f"Detached dict keys { set (dict_snapshot )} " +
394386 f"do not match current keys { current_keys } " )
395387
396- WAIT_FOR_SECONDS = 5
388+ ITER_TIMES = 50_000
397389 APPENDER_THREADS = 8
398390 REPLACER_THREADS = 8
399- race (WAIT_FOR_SECONDS , APPENDER_THREADS , REPLACER_THREADS )
391+ race (ITER_TIMES , APPENDER_THREADS , REPLACER_THREADS )
400392
401393if __name__ == "__main__" :
402394 unittest .main ()
0 commit comments