#!#File: sum_primes.py#Author: VItalii Vanovschi#Desc: This program demonstrates parallel computations with pp module#It calculates the sum of prime numbers below a given integer in parallel#Parallel Python Software: http://www.parallelpython.com/importmath, sys, timeimportppdefisprime(n):"""Returns True if n is prime and False otherwise"""ifnotisinstance(n, int):raiseTypeError("argument passed to is_prime is not of 'int' type")ifn<2:returnFalseifn==2:returnTrue
max=int(math.ceil(math.sqrt(n)))
i=2whilei<=max:ifn%i==0:returnFalse
i+=1returnTruedefsum_primes(n):"""Calculates sum of all primes below given integer n"""returnsum([xforxinxrange(2,n)ifisprime(x)])print"""Usage: python sum_primes.py [ncpus]
[ncpus] - the number of workers to run in parallel,
if omitted it will be set to the number of processors in the system"""#tuple of all parallel python servers to connect withppservers=()#ppservers = ("10.0.0.1",)iflen(sys.argv)>1:
ncpus=int(sys.argv[1])#Creates jobserver with ncpus workersjob_server=pp.Server(ncpus, ppservers=ppservers)else:#Creates jobserver with automatically detected number of workersjob_server=pp.Server(ppservers=ppservers)print"Starting pp with", job_server.get_ncpus(),"workers"#Submit a job of calulating sum_primes(100) for execution.#sum_primes - the function#(100,) - tuple with arguments for sum_primes#(isprime,) - tuple with functions on which function sum_primes depends#("math",) - tuple with module names which must be imported before sum_primes execution#Execution starts as soon as one of the workers will become availablejob1=job_server.submit(sum_primes, (100,), (isprime,), ("math",))#Retrieves the result calculated by job1#The value of job1() is the same as sum_primes(100)#If the job has not been finished yet, execution will wait here until result is availableresult=job1()print"Sum of primes below 100 is", result
start_time=time.time()#The following submits 8 jobs and then retrieves the resultsinputs=(100000,100100,100200,100300,100400,100500,100600,100700)
jobs=[(input, job_server.submit(sum_primes,(input,), (isprime,), ("math",)))forinputininputs]forinput, jobinjobs:print"Sum of primes below", input,"is", job()print"Time elapsed:", time.time()-start_time,"s"job_server.print_stats()