On Thu, Dec 9, 2010 at 5:03 AM, Astan Chee <astan.c...@gmail.com> wrote: > Thanks but I'm having trouble with that module too. Currently what I > have is something like this: > > import sys > import os > import multiprocessing > > import time > > def functionTester(num): > return ((num+2)/(num-2))**2 > > num_args = [61,62,33,7,12,16,19,35,36,37,38,55,56,57,63] > > max_result = 0 > > start = time.time() > > num_processes = multiprocessing.cpu_count() > > threads = [] > len_stas = len(num_args) > > for list_item in num_args: > if len(threads) < num_processes: > p = multiprocessing.Process(target=functionTester,args=[list_item]) > p.start() > print p, p.is_alive() > threads.append(p) > else: > for thread in threads: > if not thread.is_alive(): > threads.remove(thread) > > print "Result " + str(max_result) > end = time.time() > elapsed= end - start > print "Took", elapsed, "seconds to execute" > > But it doesn't give me any return data. It also spawns an infinite > number of (sub)processes that crashes my machine. What am I doing > wrong here? > > On 12/9/10, Jean-Michel Pichavant <jeanmic...@sequans.com> wrote: >> Astan Chee wrote: >>> Hi, >>> I've got a python script that calls a function many times with various >>> arguments and returns a result. What I'm trying to do is run this >>> function each on different processors and compile the result at the >>> end based on the function result. The script looks something like >>> this: >>> >>> >>> import time >>> >>> def functionTester(num): >>> return ((num+2)/(num-2))**2 >>> >>> num_args = [1,2,3,7,12,16,19,35,36,37,38,55,56,57,63,44,71,81,91] >>> >>> max_result = 0 >>> >>> start = time.time() >>> >>> for n in num_args: >>> result = functionTester(n) >>> if result > max_result: >>> max_result = result >>> >>> print "Result " + str(max_result) >>> end = time.time() >>> elapsed= end - start >>> print "Took", elapsed, "seconds to execute" >>> >>> >>> What I'm trying to do is run each function on a processor and when its >>> done, move on to the next function-argument specifically on windows 7 >>> x64 using python 2.6. How do I do this? >>> Thanks for any help >>> >> If I'm not wrong, CPU management is handled by your system, meaning >> there's no way to 'force' anything to run on a specific CPU. However, >> you may try to execute your fonction in a subprocess, so that the system >> will use different CPUs (hopefully). You then just need to limit the >> number of subprocess alive at the same time. >> >> Have a look here >> http://docs.python.org/library/multiprocessing.html >> >> JM >> > -- > http://mail.python.org/mailman/listinfo/python-list >
Here's a way of doing what I think you mean to do. I assume that max_result should be the maximum value returned by a run of functionTester. Also, just a note, usually function names like this are spelled function_tester rather than functionTester in python. If you need to de-python3ify it just change the line at the top and cast your nums to floats, otherwise you'll get integer division (which I again assume you don't want). #! /usr/bin/env python3 import time import multiprocessing def functionTester(num): return ((num+2)/(num-2))**2 num_args = [61,62,33,7,12,16,19,35,36,37,38,55,56,57,63] num_processes = multiprocessing.cpu_count() pool = multiprocessing.Pool(num_processes) start = time.time() results = pool.map(functionTester, num_args) end = time.time() # is this what you meant to do with the results? max_result = max(results) print("Result " + str(max_result)) elapsed = end - start print("Took", elapsed, "seconds to execute") Geremy Condra -- http://mail.python.org/mailman/listinfo/python-list