@@ -89,6 +89,47 @@ asyncio.run(main())
8989Feature demo:
9090``` Python3
9191# feature_demo.py
92-
93-
92+ from ThreadPoolExecutorPlus import ThreadPoolExecutor
93+ import time , datetime
94+
95+ def log (stmt , name = ' MAIN THREAD' ):
96+ print (f " [ { datetime.datetime.strftime(datetime.datetime.now() , ' %Y-%m-%d %H:%M:%S' )} ][ { name} ] { stmt} " )
97+
98+ def some_func (arg ):
99+ # does some heavy lifting
100+ # outputs some results
101+ log(f " New task triggered in sub thread , sleep { arg} seconds. " , ' SUB THREAD ' )
102+ time.sleep(arg)
103+ log(f " Terminated. " , ' SUB THREAD ' )
104+ return arg
105+
106+ with ThreadPoolExecutor() as executor:
107+ log(f " max_workers = { executor._max_workers} " )
108+ log(f " min_workers = { executor._min_workers} " )
109+ log(" ====================================================" )
110+
111+ log(" Reuse test:" )
112+ for _ in range (10 ):
113+ executor.submit(some_func , 0.5 )
114+ time.sleep(1 )
115+ log(f " Current poll size = { len (executor._threads)} " )
116+
117+ # Thus it perfer to reuse existing threads.
118+ log(" ====================================================" )
119+
120+ log(" Shrink test:" )
121+ log(" Adjust timeout time to 10 seconds." )
122+ executor.set_daemon_opts(min_workers = 2 , max_workers = 10 , keep_alive_time = 10 )
123+ for _ in range (10 ):
124+ executor.submit(some_func , 3 )
125+ time.sleep(0.01 )
126+ log(" 10 new tasks created." )
127+
128+
129+ time.sleep(3 )
130+ log(" All task done." )
131+
132+ for _ in range (15 ):
133+ log(f " Current poll size = { len (executor._threads)} , { _ + 1 } s passed. " )
134+ time.sleep(1 )
94135```
0 commit comments