1 # Generator implementation using threads
5 Killed
= 'Generator.Killed'
9 def __init__(self
, func
, args
):
10 self
.getlock
= thread
.allocate_lock()
11 self
.putlock
= thread
.allocate_lock()
12 self
.getlock
.acquire()
13 self
.putlock
.acquire()
18 thread
.start_new_thread(self
._start
, ())
22 self
.putlock
.acquire()
25 apply(self
.func
, (self
,) + self
.args
)
31 self
.getlock
.release()
32 # Called by producer for each value; raise Killed if no more needed
35 raise TypeError, 'put() called on killed generator'
37 self
.getlock
.release() # Resume consumer thread
38 self
.putlock
.acquire() # Wait for next get() call
41 # Called by producer to get next value; raise EOFError if no more
44 raise TypeError, 'get() called on killed generator'
45 self
.putlock
.release() # Resume producer thread
46 self
.getlock
.acquire() # Wait for value to appear
48 raise EOFError # Say there are no more values
50 # Called by consumer if no more values wanted
53 raise TypeError, 'kill() called on killed generator'
55 self
.putlock
.release()
58 return Generator(self
.func
, self
.args
)
61 k
, a
, b
, a1
, b1
= 2L, 4L, 1L, 12L, 4L
64 p
, q
, k
= k
*k
, 2L*k
+1L, k
+1L
65 a
, b
, a1
, b1
= a1
, b1
, p
*a
+q
*a1
, p
*b
+q
*b1
70 a
, a1
= 10L*(a
%b
), 10L*(a1
%b1
)
77 for i
in range(10): print g
.get(),