[BangPypers] Query on correct use of threading

Praveen Shirali praveengshirali at gmail.com
Wed Nov 9 06:31:44 EST 2016


Rajesh,

The `printer` function loops till the output_queue is empty. The printer
thread is done processing when this condition hits. Once this condition is
hit, items are no longer fetches from the output_queue. However, the
`printer` does not wait _until_ every item from the input_queue has made it
to the output_queue. The q.join() at the end waits for all items to be
fetched from both queues. So, on the off-chance that the printer hit its
condition prematurely at some point, but workers kept pushing more items
into the output_queue, the program would wait on the join().

In executions, you'd see that not all elements are printed from the
output_queue.
As a test, I replaced the check in the printer to process till all elements
are fetched (using count). This ensures that `printer` runs till every
element is pulled out of the output_queue. With this change, it doesn't
seem to hang.

Can you try with the following diff:

@@ -18,8 +18,8 @@ def increment_count(count):
     return count + 1


-def printer(q):
-    while not q.empty():
+def printer(q, count):
+    for _ in xrange(count):
         res = q.get()
         sys.stdout.write('The result is %s\n' % repr(res))
         sys.stdout.flush()
@@ -34,6 +34,8 @@ if __name__ == '__main__':
     for i in range(0, 101, 2):
         input_queue.put(i)

+    count = input_queue.qsize()
+
     nworkers = 4
     workers = []
     lock = threading.Lock()
@@ -44,7 +46,7 @@ if __name__ == '__main__':
         t.start()
         workers.append(t)

-    pt = threading.Thread(target=printer, args=(output_queue,))
+    pt = threading.Thread(target=printer, args=(output_queue, count))
     pt.daemon = True
     pt.start()


Cheers,
Praveen

On 8 November 2016 at 21:59, Rajesh Deo <rpdsec at gmail.com> wrote:

> Pls try this: https://bpaste.net/show/4279bfdb091a
>
> On Tue, Nov 8, 2016 at 9:33 PM, Noufal Ibrahim KV <noufal at nibrahim.net.in>
> wrote:
>
> > On Tue, Nov 08 2016, Rajesh Deo wrote:
> >
> > > Dear All,
> > >
> > > I was exploring the threading module and came up with following, after
> > > going through @raymondh's talk (https://www.youtube.com/
> > watch?v=Bv25Dwe84g0)
> > >
> > > http://pastebin.com/usKE6nME
> >
> > Can you put it on another pastebin service? My ISP is blocking this.
> >
> > [...]
> >
> >
> > --
> > Cordially,
> > Noufal
> > http://nibrahim.net.in
> > _______________________________________________
> > BangPypers mailing list
> > BangPypers at python.org
> > https://mail.python.org/mailman/listinfo/bangpypers
> >
> _______________________________________________
> BangPypers mailing list
> BangPypers at python.org
> https://mail.python.org/mailman/listinfo/bangpypers
>


More information about the BangPypers mailing list