Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
c05e260e
Commit
c05e260e
authored
Apr 01, 2015
by
Serhiy Storchaka
Browse files
Options
Browse Files
Download
Plain Diff
Issue #23799: Added test.support.start_threads() for running and cleaning up
multiple threads.
parents
a7726624
263dcd20
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
75 additions
and
78 deletions
+75
-78
Lib/test/support/__init__.py
Lib/test/support/__init__.py
+38
-1
Lib/test/test_bz2.py
Lib/test/test_bz2.py
+2
-4
Lib/test/test_capi.py
Lib/test/test_capi.py
+5
-9
Lib/test/test_gc.py
Lib/test/test_gc.py
+3
-9
Lib/test/test_io.py
Lib/test/test_io.py
+8
-18
Lib/test/test_threaded_import.py
Lib/test/test_threaded_import.py
+5
-5
Lib/test/test_threadedtempfile.py
Lib/test/test_threadedtempfile.py
+8
-24
Lib/test/test_threading_local.py
Lib/test/test_threading_local.py
+3
-8
Misc/NEWS
Misc/NEWS
+3
-0
No files found.
Lib/test/support/__init__.py
View file @
c05e260e
...
...
@@ -6,6 +6,7 @@ if __name__ != 'test.support':
import
collections.abc
import
contextlib
import
errno
import
faulthandler
import
fnmatch
import
functools
import
gc
...
...
@@ -96,7 +97,7 @@ __all__ = [
# logging
"TestHandler"
,
# threads
"threading_setup"
,
"threading_cleanup"
,
"threading_setup"
,
"threading_cleanup"
,
"reap_threads"
,
"start_threads"
,
# miscellaneous
"check_warnings"
,
"EnvironmentVarGuard"
,
"run_with_locale"
,
"swap_item"
,
"swap_attr"
,
"Matcher"
,
"set_memlimit"
,
"SuppressCrashReport"
,
"sortdict"
,
...
...
@@ -1941,6 +1942,42 @@ def reap_children():
except
:
break
@
contextlib
.
contextmanager
def
start_threads
(
threads
,
unlock
=
None
):
threads
=
list
(
threads
)
started
=
[]
try
:
try
:
for
t
in
threads
:
t
.
start
()
started
.
append
(
t
)
except
:
if
verbose
:
print
(
"Can't start %d threads, only %d threads started"
%
(
len
(
threads
),
len
(
started
)))
raise
yield
finally
:
try
:
if
unlock
:
unlock
()
endtime
=
starttime
=
time
.
time
()
for
timeout
in
range
(
1
,
16
):
endtime
+=
60
for
t
in
started
:
t
.
join
(
max
(
endtime
-
time
.
time
(),
0.01
))
started
=
[
t
for
t
in
started
if
t
.
isAlive
()]
if
not
started
:
break
if
verbose
:
print
(
'Unable to join %d threads during a period of '
'%d minutes'
%
(
len
(
started
),
timeout
))
finally
:
started
=
[
t
for
t
in
started
if
t
.
isAlive
()]
if
started
:
faulthandler
.
dump_traceback
(
sys
.
stdout
)
raise
AssertionError
(
'Unable to join %d threads'
%
len
(
started
))
@
contextlib
.
contextmanager
def
swap_attr
(
obj
,
attr
,
new_val
):
"""Temporary swap out an attribute with a new object.
...
...
Lib/test/test_bz2.py
View file @
c05e260e
...
...
@@ -507,10 +507,8 @@ class BZ2FileTest(BaseTest):
for
i
in
range
(
5
):
f
.
write
(
data
)
threads
=
[
threading
.
Thread
(
target
=
comp
)
for
i
in
range
(
nthreads
)]
for
t
in
threads
:
t
.
start
()
for
t
in
threads
:
t
.
join
()
with
support
.
start_threads
(
threads
):
pass
def
testWithoutThreading
(
self
):
module
=
support
.
import_fresh_module
(
"bz2"
,
blocked
=
(
"threading"
,))
...
...
Lib/test/test_capi.py
View file @
c05e260e
...
...
@@ -284,16 +284,12 @@ class TestPendingCalls(unittest.TestCase):
context
.
lock
=
threading
.
Lock
()
context
.
event
=
threading
.
Event
()
for
i
in
range
(
context
.
nThreads
):
t
=
threading
.
Thread
(
target
=
self
.
pendingcalls_thread
,
args
=
(
context
,))
t
.
start
()
threads
.
append
(
t
)
threads
=
[
threading
.
Thread
(
target
=
self
.
pendingcalls_thread
,
args
=
(
context
,))
for
i
in
range
(
context
.
nThreads
)]
with
support
.
start_threads
(
threads
):
self
.
pendingcalls_wait
(
context
.
l
,
n
,
context
)
for
t
in
threads
:
t
.
join
()
def
pendingcalls_thread
(
self
,
context
):
try
:
self
.
pendingcalls_submit
(
context
.
l
,
context
.
n
)
...
...
Lib/test/test_gc.py
View file @
c05e260e
import
unittest
from
test.support
import
(
verbose
,
refcount_test
,
run_unittest
,
strip_python_stderr
,
cpython_only
)
strip_python_stderr
,
cpython_only
,
start_threads
)
from
test.script_helper
import
assert_python_ok
,
make_script
,
temp_dir
import
sys
...
...
@@ -397,19 +397,13 @@ class GCTests(unittest.TestCase):
old_switchinterval
=
sys
.
getswitchinterval
()
sys
.
setswitchinterval
(
1e-5
)
try
:
exit
=
False
exit
=
[]
threads
=
[]
for
i
in
range
(
N_THREADS
):
t
=
threading
.
Thread
(
target
=
run_thread
)
threads
.
append
(
t
)
try
:
for
t
in
threads
:
t
.
start
()
finally
:
with
start_threads
(
threads
,
lambda
:
exit
.
append
(
1
)):
time
.
sleep
(
1.0
)
exit
=
True
for
t
in
threads
:
t
.
join
()
finally
:
sys
.
setswitchinterval
(
old_switchinterval
)
gc
.
collect
()
...
...
Lib/test/test_io.py
View file @
c05e260e
...
...
@@ -1131,11 +1131,8 @@ class BufferedReaderTest(unittest.TestCase, CommonBufferedTests):
errors
.
append
(
e
)
raise
threads
=
[
threading
.
Thread
(
target
=
f
)
for
x
in
range
(
20
)]
for
t
in
threads
:
t
.
start
()
with
support
.
start_threads
(
threads
):
time
.
sleep
(
0.02
)
# yield
for
t
in
threads
:
t
.
join
()
self
.
assertFalse
(
errors
,
"the following exceptions were caught: %r"
%
errors
)
s
=
b''
.
join
(
results
)
...
...
@@ -1454,11 +1451,8 @@ class BufferedWriterTest(unittest.TestCase, CommonBufferedTests):
errors
.
append
(
e
)
raise
threads
=
[
threading
.
Thread
(
target
=
f
)
for
x
in
range
(
20
)]
for
t
in
threads
:
t
.
start
()
with
support
.
start_threads
(
threads
):
time
.
sleep
(
0.02
)
# yield
for
t
in
threads
:
t
.
join
()
self
.
assertFalse
(
errors
,
"the following exceptions were caught: %r"
%
errors
)
bufio
.
close
()
...
...
@@ -2752,14 +2746,10 @@ class TextIOWrapperTest(unittest.TestCase):
text
=
"Thread%03d
\
n
"
%
n
event
.
wait
()
f
.
write
(
text
)
threads
=
[
threading
.
Thread
(
target
=
lambda
n
=
x
:
run
(
n
))
threads
=
[
threading
.
Thread
(
target
=
run
,
args
=
(
x
,
))
for
x
in
range
(
20
)]
for
t
in
threads
:
t
.
start
()
with
support
.
start_threads
(
threads
,
event
.
set
):
time
.
sleep
(
0.02
)
event
.
set
()
for
t
in
threads
:
t
.
join
()
with
self
.
open
(
support
.
TESTFN
)
as
f
:
content
=
f
.
read
()
for
n
in
range
(
20
):
...
...
Lib/test/test_threaded_import.py
View file @
c05e260e
...
...
@@ -14,7 +14,7 @@ import shutil
import
unittest
from
test.support
import
(
verbose
,
import_module
,
run_unittest
,
TESTFN
,
reap_threads
,
forget
,
unlink
,
rmtree
)
forget
,
unlink
,
rmtree
,
start_threads
)
threading
=
import_module
(
'threading'
)
def
task
(
N
,
done
,
done_tasks
,
errors
):
...
...
@@ -116,10 +116,10 @@ class ThreadedImportTests(unittest.TestCase):
done_tasks
=
[]
done
.
clear
()
t0
=
time
.
monotonic
()
for
i
in
range
(
N
):
t
=
threading
.
Thread
(
target
=
task
,
with
start_threads
(
threading
.
Thread
(
target
=
task
,
args
=
(
N
,
done
,
done_tasks
,
errors
,))
t
.
start
()
for
i
in
range
(
N
)):
pass
completed
=
done
.
wait
(
10
*
60
)
dt
=
time
.
monotonic
()
-
t0
if
verbose
:
...
...
Lib/test/test_threadedtempfile.py
View file @
c05e260e
...
...
@@ -18,7 +18,7 @@ FILES_PER_THREAD = 50
import
tempfile
from
test.support
import
threading_setup
,
threading_cleanup
,
run_unittest
,
import_module
from
test.support
import
start_threads
,
import_module
threading
=
import_module
(
'threading'
)
import
unittest
import
io
...
...
@@ -46,33 +46,17 @@ class TempFileGreedy(threading.Thread):
class
ThreadedTempFileTest
(
unittest
.
TestCase
):
def
test_main
(
self
):
threads
=
[]
thread_info
=
threading_setup
()
for
i
in
range
(
NUM_THREADS
):
t
=
TempFileGreedy
()
threads
.
append
(
t
)
t
.
start
()
startEvent
.
set
()
ok
=
0
errors
=
[]
for
t
in
threads
:
t
.
join
()
ok
+=
t
.
ok_count
if
t
.
error_count
:
errors
.
append
(
str
(
t
.
name
)
+
str
(
t
.
errors
.
getvalue
()))
threading_cleanup
(
*
thread_info
)
threads
=
[
TempFileGreedy
()
for
i
in
range
(
NUM_THREADS
)]
with
start_threads
(
threads
,
startEvent
.
set
):
pass
ok
=
sum
(
t
.
ok_count
for
t
in
threads
)
errors
=
[
str
(
t
.
name
)
+
str
(
t
.
errors
.
getvalue
())
for
t
in
threads
if
t
.
error_count
]
msg
=
"Errors: errors %d ok %d
\
n
%s"
%
(
len
(
errors
),
ok
,
'
\
n
'
.
join
(
errors
))
self
.
assertEqual
(
errors
,
[],
msg
)
self
.
assertEqual
(
ok
,
NUM_THREADS
*
FILES_PER_THREAD
)
def
test_main
():
run_unittest
(
ThreadedTempFileTest
)
if
__name__
==
"__main__"
:
test_
main
()
unittest
.
main
()
Lib/test/test_threading_local.py
View file @
c05e260e
...
...
@@ -64,14 +64,9 @@ class BaseLocalTest:
# Simply check that the variable is correctly set
self
.
assertEqual
(
local
.
x
,
i
)
threads
=
[]
for
i
in
range
(
10
):
t
=
threading
.
Thread
(
target
=
f
,
args
=
(
i
,))
t
.
start
()
threads
.
append
(
t
)
for
t
in
threads
:
t
.
join
()
with
support
.
start_threads
(
threading
.
Thread
(
target
=
f
,
args
=
(
i
,))
for
i
in
range
(
10
)):
pass
def
test_derived_cycle_dealloc
(
self
):
# http://bugs.python.org/issue6990
...
...
Misc/NEWS
View file @
c05e260e
...
...
@@ -230,6 +230,9 @@ Build
Tests
-----
-
Issue
#
23799
:
Added
test
.
support
.
start_threads
()
for
running
and
cleaning
up
multiple
threads
.
-
Issue
#
22390
:
test
.
regrtest
now
emits
a
warning
if
temporary
files
or
directories
are
left
after
running
a
test
.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment