blob: 1e1c55321f9260c575e0b33d1d6a93e08d2dca52 [file] [log] [blame]
Tim Petersaa222232001-05-22 09:34:27 +00001# This is a variant of the very old (early 90's) file
2# Demo/threads/bug.py. It simply provokes a number of threads into
3# trying to import the same module "at the same time".
4# There are no pleasant failure modes -- most likely is that Python
5# complains several times about module random having no attribute
6# randrange, and then Python hangs.
7
8import thread
Jack Jansen87797872001-08-29 20:26:24 +00009from test_support import verbose, TestSkipped
Tim Petersaa222232001-05-22 09:34:27 +000010
11critical_section = thread.allocate_lock()
12done = thread.allocate_lock()
13
14def task():
15 global N, critical_section, done
16 import random
17 x = random.randrange(1, 3)
18 critical_section.acquire()
19 N -= 1
20 if N == 0:
21 done.release()
22 critical_section.release()
23
Tim Petersd9742212001-05-22 18:28:25 +000024# Tricky: When regrtest imports this module, the thread running regrtest
25# grabs the import lock and won't let go of it until this module returns.
26# All other threads attempting an import hang for the duration. Since
27# this test spawns threads that do little *but* import, we can't do that
28# successfully until after this module finishes importing and regrtest
29# regains control. To make this work, a special case was added to
30# regrtest to invoke a module's "test_main" function (if any) after
31# importing it.
Tim Petersaa222232001-05-22 09:34:27 +000032
Tim Petersd9742212001-05-22 18:28:25 +000033def test_main(): # magic name! see above
Tim Petersaa222232001-05-22 09:34:27 +000034 global N, done
Jack Jansen87797872001-08-29 20:26:24 +000035 import sys
36 for modname in sys.modules:
37 if modname.find('autotest') >= 0:
38 raise TestSkipped("can't run from autotest")
Tim Petersaa222232001-05-22 09:34:27 +000039 done.acquire()
Tim Petersd9742212001-05-22 18:28:25 +000040 for N in (20, 50) * 3:
41 if verbose:
42 print "Trying", N, "threads ...",
Tim Petersaa222232001-05-22 09:34:27 +000043 for i in range(N):
44 thread.start_new_thread(task, ())
45 done.acquire()
Tim Petersd9742212001-05-22 18:28:25 +000046 if verbose:
47 print "OK."
Tim Petersaa222232001-05-22 09:34:27 +000048
Tim Petersd9742212001-05-22 18:28:25 +000049if __name__ == "__main__":
50 test_main()