Help | Site Map
Connecting Tech Pros Worldwide
 
 
LinkBack Thread Tools
  #1  
Old October 10th, 2008, 09:35 PM
nhwarriors
Guest
 
Posts: n/a
Default Using multiprocessing

I am attempting to use the (new in 2.6) multiprocessing package to
process 2 items in a large queue of items simultaneously. I'd like to
be able to print to the screen the results of each item before
starting the next one. I'm having trouble with this so far.

Here is some (useless) example code that shows how far I've gotten by
reading the documentation:

from multiprocessing import Process, Queue, current_process

def main():
facs = []
for i in range(50000,50005):
facs.append(i)

tasks = [(fac, (i,)) for i in facs]
task_queue = Queue()
done_queue = Queue()

for task in tasks:
task_queue.put(task)

for i in range(2):
Process(target = worker, args = (task_queue, done_queue)).start()

for i in range(len(tasks)):
print done_queue.get()

for i in range(2):
task_queue.put('STOP')

def worker(input, output):
for func, args in iter(input.get, 'STOP'):
result = func(*args)
output.put(result)

def fac(n):
f = n
for i in range(n-1,1,-1):
f *= i
return 'fac('+str(n)+') done on '+current_process().name

if __name__ == '__main__':
main()

This works great, except that nothing can be output until everything
in the queue is finished. I'd like to write out the result of fac(n)
for each item in the queue as it happens.

I'm probably approaching the problem all wrong - can anyone set me on
the right track?
  #2  
Old October 11th, 2008, 03:05 AM
Jesse Noller
Guest
 
Posts: n/a
Default Re: Using multiprocessing

On Fri, Oct 10, 2008 at 4:32 PM, nhwarriors <edward.reed@gmail.comwrote:
Quote:
I am attempting to use the (new in 2.6) multiprocessing package to
process 2 items in a large queue of items simultaneously. I'd like to
be able to print to the screen the results of each item before
starting the next one. I'm having trouble with this so far.
>
Here is some (useless) example code that shows how far I've gotten by
reading the documentation:
>
from multiprocessing import Process, Queue, current_process
>
def main():
facs = []
for i in range(50000,50005):
facs.append(i)
>
tasks = [(fac, (i,)) for i in facs]
task_queue = Queue()
done_queue = Queue()
>
for task in tasks:
task_queue.put(task)
>
for i in range(2):
Process(target = worker, args = (task_queue, done_queue)).start()
>
for i in range(len(tasks)):
print done_queue.get()
>
for i in range(2):
task_queue.put('STOP')
>
def worker(input, output):
for func, args in iter(input.get, 'STOP'):
result = func(*args)
output.put(result)
>
def fac(n):
f = n
for i in range(n-1,1,-1):
f *= i
return 'fac('+str(n)+') done on '+current_process().name
>
if __name__ == '__main__':
main()
>
This works great, except that nothing can be output until everything
in the queue is finished. I'd like to write out the result of fac(n)
for each item in the queue as it happens.
>
I'm probably approaching the problem all wrong - can anyone set me on
the right track?
I'm not quite following: If you run this, the results are printed by
the main thread, unordered, as they are put on the results queue -
this works as intended (and the example this is based on works the
same way) .

For example:
result put Process-2
result put Process-1
fac(50000) done on Process-1
result put Process-2
fac(50001) done on Process-2
result put Process-1
fac(50003) done on Process-1
result put Process-2
fac(50002) done on Process-2
fac(50004) done on Process-2

You can see this if you expand the range:

result put Process-1
result put Process-2
result put Process-2
fac(50001) done on Process-2
result put Process-1
fac(50000) done on Process-1
fac(50003) done on Process-2
result put Process-2
result put Process-1
fac(50004) done on Process-2
result put Process-2
fac(50006) done on Process-2
result put Process-1
fac(50002) done on Process-1
fac(50005) done on Process-1
fac(50007) done on Process-1
result put Process-2
result put Process-1
fac(50008) done on Process-2
result put Process-2
result put Process-1
fac(50010) done on Process-2
result put Process-2
result put Process-1
fac(50009) done on Process-1
fac(50011) done on Process-1
fac(50013) done on Process-1
result put Process-2
fac(50012) done on Process-2
fac(50014) done on Process-2

One trick I use is when I have a results queue to manage, I spawn an
addition process to read off of the results queue and deal with the
results. This is mainly so I can process the results outside of the
main thread, as they appear on the results queue

-jesse
  #3  
Old October 11th, 2008, 03:55 AM
Aaron \Castironpi\ Brady
Guest
 
Posts: n/a
Default Re: Using multiprocessing

On Oct 10, 3:32*pm, nhwarriors <edward.r...@gmail.comwrote:
Quote:
I am attempting to use the (new in 2.6) multiprocessing package to
process 2 items in a large queue of items simultaneously. I'd like to
be able to print to the screen the results of each item before
starting the next one. I'm having trouble with this so far.
>
Here is some (useless) example code that shows how far I've gotten by
reading the documentation:
>
snip code
Quote:
>
This works great, except that nothing can be output until everything
in the queue is finished. I'd like to write out the result of fac(n)
for each item in the queue as it happens.
>
I'm probably approaching the problem all wrong - can anyone set me on
the right track?
Works fine for me. Formatting time.clock(), with a different range:

0.00000 fac(25000) done on Process-2
0.09334 fac(25001) done on Process-1
2.25036 fac(25002) done on Process-2
2.41227 fac(25003) done on Process-1
3.57167 fac(25004) done on Process-2

I'm on Win32.
  #4  
Old October 11th, 2008, 04:55 AM
nhwarriors
Guest
 
Posts: n/a
Default Re: Using multiprocessing

On Oct 10, 10:52*pm, "Aaron \"Castironpi\" Brady"
<castiro...@gmail.comwrote:
Quote:
On Oct 10, 3:32*pm, nhwarriors <edward.r...@gmail.comwrote:
>
>
>
Quote:
I am attempting to use the (new in 2.6) multiprocessing package to
process 2 items in a large queue of items simultaneously. I'd like to
be able to print to the screen the results of each item before
starting the next one. I'm having trouble with this so far.
>
Quote:
Here is some (useless) example code that shows how far I've gotten by
reading the documentation:
>
snip code
>
Quote:
This works great, except that nothing can be output until everything
in the queue is finished. I'd like to write out the result of fac(n)
for each item in the queue as it happens.
>
Quote:
I'm probably approaching the problem all wrong - can anyone set me on
the right track?
>
Works fine for me. *Formatting time.clock(), with a different range:
>
0.00000 fac(25000) done on Process-2
0.09334 fac(25001) done on Process-1
2.25036 fac(25002) done on Process-2
2.41227 fac(25003) done on Process-1
3.57167 fac(25004) done on Process-2
>
I'm on Win32.
Strange. I was on Win32 (Cygwin) earlier today and it was doing what I
reported above. At home on Linux, it works as I wanted and you
experienced. Must be something screwy with running it in Cygwin.

Thanks guys!
  #5  
Old October 11th, 2008, 05:55 AM
Aaron \Castironpi\ Brady
Guest
 
Posts: n/a
Default Re: Using multiprocessing

On Oct 10, 10:48*pm, nhwarriors <edward.r...@gmail.comwrote:
Quote:
On Oct 10, 10:52*pm, "Aaron \"Castironpi\" Brady"
>
>
>
<castiro...@gmail.comwrote:
Quote:
On Oct 10, 3:32*pm, nhwarriors <edward.r...@gmail.comwrote:
>
Quote:
Quote:
I am attempting to use the (new in 2.6) multiprocessing package to
process 2 items in a large queue of items simultaneously. I'd like to
be able to print to the screen the results of each item before
starting the next one. I'm having trouble with this so far.
>
Quote:
Quote:
Here is some (useless) example code that shows how far I've gotten by
reading the documentation:
>
Quote:
snip code
>
Quote:
Quote:
This works great, except that nothing can be output until everything
in the queue is finished. I'd like to write out the result of fac(n)
for each item in the queue as it happens.
>
Quote:
Quote:
I'm probably approaching the problem all wrong - can anyone set me on
the right track?
>
Quote:
Works fine for me. *Formatting time.clock(), with a different range:
>
Quote:
0.00000 fac(25000) done on Process-2
0.09334 fac(25001) done on Process-1
2.25036 fac(25002) done on Process-2
2.41227 fac(25003) done on Process-1
3.57167 fac(25004) done on Process-2
>
Quote:
I'm on Win32.
>
Strange. I was on Win32 (Cygwin) earlier today and it was doing what I
reported above. At home on Linux, it works as I wanted and you
experienced. Must be something screwy with running it in Cygwin.
>
Thanks guys!
You might need to flush the standard out between calls. That gets
suggested from time to time. Not sure what Python's req.s are.
 

Bookmarks

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are Off
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over network members.
Post your question now . . .
It's fast and it's free

Popular Articles