import unittest from itertools import cycle from threading import Event, Thread from unittest import TestCase from test.support import threading_helper @threading_helper.requires_working_threading() class TestStr(TestCase): def test_racing_join_extend(self): '''Test joining a string being extended by another thread''' l = [] ITERS = 100 READERS = 10 done_event = Event() def writer_func(): for i in range(ITERS): l.extend(map(str, range(i))) l.clear() done_event.set() def reader_func(): while not done_event.is_set(): ''.join(l) writer = Thread(target=writer_func) readers = [] for x in range(READERS): reader = Thread(target=reader_func) readers.append(reader) reader.start() writer.start() writer.join() for reader in readers: reader.join() def test_racing_join_replace(self): ''' Test joining a string of characters being replaced with ephemeral strings by another thread. ''' l = [*'abcdefg'] MAX_ORDINAL = 1_000 READERS = 10 done_event = Event() def writer_func(): for i, c in zip(cycle(range(len(l))), map(chr, range(128, MAX_ORDINAL))): l[i] = c done_event.set() def reader_func(): while not done_event.is_set(): ''.join(l) ''.join(l) ''.join(l) ''.join(l) writer = Thread(target=writer_func) readers = [] for x in range(READERS): reader = Thread(target=reader_func) readers.append(reader) reader.start() writer.start() writer.join() for reader in readers: reader.join() if __name__ == "__main__": unittest.main()