|
2 | 2 |
|
3 | 3 | from unittest import TestCase |
4 | 4 |
|
| 5 | +from test import support |
5 | 6 | from test.support import threading_helper |
| 7 | +from threading import Thread |
6 | 8 |
|
7 | 9 | @threading_helper.requires_working_threading() |
| 10 | +@support.requires_resource("cpu") |
8 | 11 | class TestGen(TestCase): |
9 | | - def test_generator_send(self): |
10 | | - import threading |
11 | | - |
| 12 | + def infinite_generator(self): |
12 | 13 | def gen(): |
13 | | - for _ in range(5_000): |
| 14 | + while True: |
14 | 15 | yield |
15 | 16 |
|
| 17 | + return gen() |
| 18 | + |
| 19 | + def stress_generator(self, *funcs): |
| 20 | + threads = [] |
| 21 | + gen = self.infinite_generator() |
| 22 | + |
| 23 | + for func in funcs: |
| 24 | + for _ in range(10): |
| 25 | + def with_iterations(gen): |
| 26 | + for _ in range(100): |
| 27 | + func(gen) |
16 | 28 |
|
17 | | - it = gen() |
18 | | - with threading_helper.catch_threading_exception() as cm: |
19 | | - # next(it) is equivalent to it.send(None) |
20 | | - with threading_helper.start_threads( |
21 | | - (threading.Thread(target=lambda: next(it)) for _ in range(10)) |
22 | | - ): |
23 | | - pass |
| 29 | + threads.append(Thread(target=with_iterations, args=(gen,))) |
| 30 | + |
| 31 | + for thread in threads: |
| 32 | + thread.start() |
| 33 | + |
| 34 | + for thread in threads: |
| 35 | + thread.join() |
| 36 | + |
| 37 | + def test_generator_send(self): |
| 38 | + self.stress_generator(lambda gen: next(gen)) |
24 | 39 |
|
25 | | - self.assertIsNone(cm.exc_value) |
| 40 | + def test_generator_close(self): |
| 41 | + self.stress_generator(lambda gen: gen.close()) |
| 42 | + self.stress_generator(lambda gen: next(gen), lambda gen: gen.close()) |
26 | 43 |
|
| 44 | + def test_generator_state(self): |
| 45 | + self.stress_generator(lambda gen: next(gen), lambda gen: gen.gi_running) |
| 46 | + self.stress_generator(lambda gen: gen.gi_isrunning, lambda gen: gen.close()) |
27 | 47 |
|
28 | 48 | if __name__ == "__main__": |
29 | 49 | unittest.main() |
0 commit comments