Merged release21-maint changes.
[python/dscho.git] / Lib / test / test_threaded_import.py
blobfafb8737de416823cff4b473c909b79039ce12df
1 # 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.
8 import thread
9 from test_support import verbose
11 critical_section = thread.allocate_lock()
12 done = thread.allocate_lock()
14 def 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()
24 # 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.
33 def test_main(): # magic name! see above
34 global N, done
35 done.acquire()
36 for N in (20, 50) * 3:
37 if verbose:
38 print "Trying", N, "threads ...",
39 for i in range(N):
40 thread.start_new_thread(task, ())
41 done.acquire()
42 if verbose:
43 print "OK."
45 if __name__ == "__main__":
46 test_main()