run a function in another processor in python
geremy condra
debatem1 at gmail.com
Thu Dec 9 12:16:09 EST 2010
On Thu, Dec 9, 2010 at 5:03 AM, Astan Chee <astan.chee at 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 <jeanmichel at 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
More information about the Python-list
mailing list