| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,75 @@ | ||
| import sys | ||
| 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() | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| Added ``Py_BEGIN_CRITICAL_SECTION_SEQUENCE_FAST`` and | ||
| ``Py_END_CRITICAL_SECTION_SEQUENCE_FAST`` macros to make it possible to use | ||
| PySequence_Fast APIs safely when free-threaded, and update str.join to work | ||
| without the GIL using them. |
| Back | FazBrowse Home | New Git URL |
Uh oh!
There was an error while loading. Please reload this page.