| from threading import Barrier, Thread | |
| from test.test_json import CTest | |
| from test.support import threading_helper | |
| def encode_json_helper( | |
| json, worker, data, number_of_threads=12, number_of_json_encodings=100 | |
| ): | |
| worker_threads = [] | |
| barrier = Barrier(number_of_threads) | |
| for index in range(number_of_threads): | |
| worker_threads.append( | |
| Thread(target=worker, args=[barrier, data, index]) | |
| ) | |
| for t in worker_threads: | |
| t.start() | |
| for ii in range(number_of_json_encodings): | |
| json.dumps(data) | |
| data.clear() | |
| for t in worker_threads: | |
| t.join() | |
| class MyMapping(dict): | |
| def __init__(self): | |
| self.mapping = [] | |
| def items(self): | |
| return self.mapping | |
| @threading_helper.requires_working_threading() | |
| class TestJsonEncoding(CTest): | |
| # Test encoding json with concurrent threads modifying the data cannot | |
| # corrupt the interpreter | |
| @threading_helper.reap_threads | |
| def test_json_mutating_list(self): | |
| def worker(barrier, data, index): | |
| barrier.wait() | |
| while data: | |
| for d in data: | |
| if len(d) > 5: | |
| d.clear() | |
| else: | |
| d.append(index) | |
| data = [[], []] | |
| encode_json_helper(self.json, worker, data) | |
| @threading_helper.reap_threads | |
| def test_json_mutating_exact_dict(self): | |
| def worker(barrier, data, index): | |
| barrier.wait() | |
| while data: | |
| for d in data: | |
| if len(d) > 5: | |
| try: | |
| key = list(d)[0] | |
| d.pop(key) | |
| except (KeyError, IndexError): | |
| pass | |
| else: | |
| d[index] = index | |
| data = [{}, {}] | |
| encode_json_helper(self.json, worker, data) | |
| @threading_helper.reap_threads | |
| def test_json_mutating_mapping(self): | |
| def worker(barrier, data, index): | |
| barrier.wait() | |
| while data: | |
| for d in data: | |
| if len(d.mapping) > 3: | |
| d.mapping.clear() | |
| else: | |
| d.mapping.append((index, index)) | |
| data = [MyMapping(), MyMapping()] | |
| encode_json_helper(self.json, worker, data) |