Mercurial > cpython-lru_cache-weakref
annotate Lib/test/test_thread.py @ 25838:8540887bcec6 2.2
Backport of 2.183:
Fix memory leak in add_subclass() found by NealN with valgrind.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Fri, 18 Oct 2002 13:42:21 +0000 |
| parents | 2714739d483b |
| children | aa0d2d51fbde |
| rev | line source |
|---|---|
| 1588 | 1 # Very rudimentary test of thread module |
| 2 | |
| 3 # Create a bunch of threads, let each do some work, wait until all are done | |
| 4 | |
|
15966
e59b835ad89a
a bold attempt to fix things broken by MAL's verify patch: import
Fredrik Lundh <fredrik@pythonware.com>
parents:
15957
diff
changeset
|
5 from test_support import verbose |
|
8394
93aa08c77e60
Use random instead of whrandom.
Guido van Rossum <guido@python.org>
parents:
5845
diff
changeset
|
6 import random |
| 1588 | 7 import thread |
| 8 import time | |
| 9 | |
| 10 mutex = thread.allocate_lock() | |
|
8394
93aa08c77e60
Use random instead of whrandom.
Guido van Rossum <guido@python.org>
parents:
5845
diff
changeset
|
11 rmutex = thread.allocate_lock() # for calls to random |
| 1588 | 12 running = 0 |
| 13 done = thread.allocate_lock() | |
| 14 done.acquire() | |
| 15 | |
|
1647
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
16 numtasks = 10 |
|
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
17 |
| 1588 | 18 def task(ident): |
|
15305
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
19 global running |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
20 rmutex.acquire() |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
21 delay = random.random() * numtasks |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
22 rmutex.release() |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
23 if verbose: |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
24 print 'task', ident, 'will run for', round(delay, 1), 'sec' |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
25 time.sleep(delay) |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
26 if verbose: |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
27 print 'task', ident, 'done' |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
28 mutex.acquire() |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
29 running = running - 1 |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
30 if running == 0: |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
31 done.release() |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
32 mutex.release() |
| 1588 | 33 |
| 34 next_ident = 0 | |
| 35 def newtask(): | |
|
15305
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
36 global next_ident, running |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
37 mutex.acquire() |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
38 next_ident = next_ident + 1 |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
39 if verbose: |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
40 print 'creating task', next_ident |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
41 thread.start_new_thread(task, (next_ident,)) |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
42 running = running + 1 |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
43 mutex.release() |
| 1588 | 44 |
|
1647
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
45 for i in range(numtasks): |
|
15305
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
46 newtask() |
| 1588 | 47 |
| 48 print 'waiting for all tasks to complete' | |
| 49 done.acquire() | |
| 50 print 'all tasks done' | |
|
1647
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
51 |
|
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
52 class barrier: |
|
15305
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
53 def __init__(self, n): |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
54 self.n = n |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
55 self.waiting = 0 |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
56 self.checkin = thread.allocate_lock() |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
57 self.checkout = thread.allocate_lock() |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
58 self.checkout.acquire() |
|
1647
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
59 |
|
15305
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
60 def enter(self): |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
61 checkin, checkout = self.checkin, self.checkout |
|
1647
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
62 |
|
15305
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
63 checkin.acquire() |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
64 self.waiting = self.waiting + 1 |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
65 if self.waiting == self.n: |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
66 self.waiting = self.n - 1 |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
67 checkout.release() |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
68 return |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
69 checkin.release() |
|
1647
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
70 |
|
15305
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
71 checkout.acquire() |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
72 self.waiting = self.waiting - 1 |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
73 if self.waiting == 0: |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
74 checkin.release() |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
75 return |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
76 checkout.release() |
|
1647
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
77 |
|
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
78 numtrips = 3 |
|
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
79 def task2(ident): |
|
15305
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
80 global running |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
81 for i in range(numtrips): |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
82 if ident == 0: |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
83 # give it a good chance to enter the next |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
84 # barrier before the others are all out |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
85 # of the current one |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
86 delay = 0.001 |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
87 else: |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
88 rmutex.acquire() |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
89 delay = random.random() * numtasks |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
90 rmutex.release() |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
91 if verbose: |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
92 print 'task', ident, 'will run for', round(delay, 1), 'sec' |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
93 time.sleep(delay) |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
94 if verbose: |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
95 print 'task', ident, 'entering barrier', i |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
96 bar.enter() |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
97 if verbose: |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
98 print 'task', ident, 'leaving barrier', i |
|
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
99 mutex.acquire() |
|
21995
2714739d483b
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
15966
diff
changeset
|
100 running -= 1 |
|
2714739d483b
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
15966
diff
changeset
|
101 # Must release mutex before releasing done, else the main thread can |
|
2714739d483b
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
15966
diff
changeset
|
102 # exit and set mutex to None as part of global teardown; then |
|
2714739d483b
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
15966
diff
changeset
|
103 # mutex.release() raises AttributeError. |
|
2714739d483b
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
15966
diff
changeset
|
104 finished = running == 0 |
|
2714739d483b
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
15966
diff
changeset
|
105 mutex.release() |
|
2714739d483b
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
15966
diff
changeset
|
106 if finished: |
|
15305
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
107 done.release() |
|
1647
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
108 |
|
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
109 print '\n*** Barrier Test ***' |
|
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
110 if done.acquire(0): |
|
15305
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
111 raise ValueError, "'done' should have remained acquired" |
|
1647
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
112 bar = barrier(numtasks) |
|
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
113 running = numtasks |
|
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
114 for i in range(numtasks): |
|
15305
07f24261c6e6
Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents:
8394
diff
changeset
|
115 thread.start_new_thread(task2, (i,)) |
|
1647
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
116 done.acquire() |
|
03e097ddeca2
added barrier test (by Tim Peters)
Guido van Rossum <guido@python.org>
parents:
1588
diff
changeset
|
117 print 'all tasks done' |
