1+ import os , sys
2+ sys .path .append (os .getcwd ())
3+ import pytest
4+ from ThreadPoolExecutorPlus import *
5+ import time
6+
7+ def test_feature ():
8+
9+ def some_func (arg ):
10+ # does some heavy lifting
11+ # outputs some results
12+ time .sleep (arg )
13+ return arg
14+
15+ def some_error ():
16+ raise RuntimeError ()
17+
18+ with ThreadPoolExecutor () as executor :
19+ assert executor ._max_workers >= executor ._min_workers
20+
21+ # test reuseability
22+ results = []
23+ _range = 10
24+ _sec = 0.5
25+ for _ in range (_range ):
26+ results .append (executor .submit (some_func , _sec / 2 ))
27+ time .sleep (_sec )
28+ assert len (executor ._threads ) == min (_ + 1 , executor ._min_workers )
29+
30+ # test return
31+ results = list (map (lambda x :x .result () , results ))
32+ assert results == [_sec / 2 ] * _range
33+
34+ # test raise
35+ result = executor .submit (some_error )
36+ time .sleep (_sec )
37+ assert result .done ()
38+ assert isinstance (result .exception () , RuntimeError )
39+
40+ # test opt
41+ _range2 = 2
42+ _range3 = 10
43+ _time2 = 5
44+ _sleeptime = 2
45+ _interval = 0.01
46+ _inaccuracy = 0.5
47+ executor .set_daemon_opts (min_workers = _range2 , max_workers = _range3 , keep_alive_time = _time2 )
48+ assert executor ._min_workers == _range2
49+ assert executor ._max_workers == _range3
50+ assert executor ._keep_alive_time == _time2
51+
52+ # test execute
53+ results = []
54+ start_time = time .time ()
55+ for _ in range (_range3 ):
56+ results .append (executor .submit (some_func , _sleeptime ))
57+ time .sleep (_interval )
58+
59+ list (map (lambda x :x .result () , results ))
60+ end_time = time .time ()
61+ assert (_sleeptime - _inaccuracy ) <= (end_time - start_time ) <= (_sleeptime + _inaccuracy + _interval * _range3 )
62+
63+ # test shrink
64+ assert len (executor ._threads ) == _range3
65+ time .sleep (_time2 + _inaccuracy * 2 )
66+ assert len (executor ._threads ) == _range2 or len (executor ._threads ) == (_range2 + 1 )
67+
68+ # test overflow
69+ _range4 = _range2 * 2
70+ _time3 = 0.5
71+ executor .set_daemon_opts (min_workers = _range2 , max_workers = _range2 )
72+ results = []
73+ start_time = time .time ()
74+ for _ in range (_range4 ):
75+ results .append (executor .submit (some_func , _time3 ))
76+
77+ list (map (lambda x :x .result () , results ))
78+ end_time = time .time ()
79+ expect_time = (_time3 * _range4 ) / _range2
80+ assert (expect_time - _inaccuracy ) <= (end_time - start_time ) <= (expect_time + _inaccuracy )
0 commit comments