Reputation: 131
I have a code, that is supposed to check for prime numbers in a given range of numbers. I want it to be executed in parallel. However, I don't manage to get it running. Depending on how I pass the numbers to it, it either works and checks for prime numbers correctly, but without running in parallel, or it doesn't check for prime numbers, but starts many python processes and apparently parallelizes doing nothing. Both obviously are not what I hoped for.
My function is_prime()
should check if a number is a prime number. In stand-alone mode, it does exactly that.
import time
import multiprocessing
def is_prime(n):
if (n <= 1) :
return 'not a prime number'
if (n <= 3) :
return 'prime number'
if (n % 2 == 0 or n % 3 == 0) :
return 'not a prime number'
i = 5
while(i * i <= n):
if (n % i == 0 or n % (i + 2) == 0) :
return 'not a prime number'
i = i + 6
return 'prime number'
The multiprocessing_func(x)
function is supposed to print for every number it gets, if that number is a prime number, as checked by is_prime()
. This works as well if I call the function regularly.
def multiprocessing_func(x):
time.sleep(2)
print('{} is {}'.format(x, is_prime(x)))
Now if I want to run the above functions in parallel with the multiprocessing module, I tried to pass the arguments to the above function with target=multiprocessing_func, args=(i,)
like in the code below. This results in starting many python processes, but not in checking for prime numbers. If I run it with target=multiprocessing_func(i), args=(i,)
instead, it checks for prime numbers but not in parallel.
if __name__ == '__main__':
starttime = time.time()
processes = []
for i in range(1,200):
p = multiprocessing.Process(target=multiprocessing_func, args=(i,))
processes.append(p)
p.start()
for process in processes:
process.join()
print('Time taken = {} seconds'.format(time.time() - starttime))
Does anybody have a clue, what I am doing wrong here? I don't really get it. Thank you so much for your help!
Upvotes: 1
Views: 291
Reputation: 9533
Your code is correct.
Creating a process is a heavy task, and your function is very fast, so you may get a process and run quickly, it exit, before next process is ever prepared and started.
Note: from the logic of your is_prime()
, the smaller the integer, the shorter time it takes to execute the function. So also in this case, it doesn't help to see processes.
I modified your code with:
time.sleep(random.randint(2, 6))
so now you have some more time (and random) in each process.
But probably you must calculate larger blocks per process, in order to give some work to processes (and getting them into kernel scheduler) (e.g. check 10_000 primes in multiprocessing_func
and the main program just send the start of block), or check just much larger numbers.
So: your code is correct, but there is not real work for CPU, in order to really see multiprocessing in full.
Upvotes: 1
Reputation: 26
I'm running it in Python 2.7 and it works fine.
The code:
import multiprocessing
import time
def is_prime(n):
if (n <= 1):
return 'not a prime number'
if (n <= 3):
return 'prime number'
if (n % 2 == 0 or n % 3 == 0):
return 'not a prime number'
i = 5
while (i * i <= n):
if (n % i == 0 or n % (i + 2) == 0):
return 'not a prime number'
i = i + 6
return 'prime number'
def multiprocessing_func(x):
time.sleep(2)
print('{} is {}'.format(x, is_prime(x)))
if __name__ == '__main__':
starttime = time.time()
processes = []
for i in range(1, 200):
p = multiprocessing.Process(target=multiprocessing_func, args=(i,))
processes.append(p)
p.start()
for process in processes:
process.join()
print('Time taken = {} seconds'.format(time.time() - starttime))
The output:
3 is prime number1 is not a prime number
2 is prime number
5 is prime number6 is not a prime number
7 is prime number8 is not a prime number
9 is not a prime number
10 is not a prime number
14 is not a prime number12 is not a prime number16 is not a prime number
15 is not a prime number
13 is prime number
4 is not a prime number
17 is prime number
26 is not a prime number
21 is not a prime number24 is not a prime number
29 is prime number
20 is not a prime number27 is not a prime number22 is not a prime number19 is prime number
25 is not a prime number
18 is not a prime number
30 is not a prime number11 is prime number
23 is prime number
28 is not a prime number33 is not a prime number31 is prime number
32 is not a prime number35 is not a prime number34 is not a prime number
39 is not a prime number36 is not a prime number38 is not a prime number37 is prime number
40 is not a prime number
41 is prime number
42 is not a prime number43 is prime number
45 is not a prime number44 is not a prime number
46 is not a prime number47 is prime number48 is not a prime number
49 is not a prime number
50 is not a prime number
52 is not a prime number51 is not a prime number
53 is prime number54 is not a prime number55 is not a prime number
56 is not a prime number
59 is prime number
57 is not a prime number
61 is prime number
62 is not a prime number60 is not a prime number
64 is not a prime number63 is not a prime number58 is not a prime number
67 is prime number65 is not a prime number66 is not a prime number68 is not a prime number
69 is not a prime number
70 is not a prime number72 is not a prime number
71 is prime number
74 is not a prime number73 is prime number
75 is not a prime number
78 is not a prime number
77 is not a prime number
80 is not a prime number
83 is prime number
85 is not a prime number79 is prime number
81 is not a prime number
76 is not a prime number84 is not a prime number
82 is not a prime number
87 is not a prime number89 is prime number
88 is not a prime number
90 is not a prime number92 is not a prime number91 is not a prime number
86 is not a prime number
95 is not a prime number
93 is not a prime number94 is not a prime number
96 is not a prime number
97 is prime number99 is not a prime number98 is not a prime number
101 is prime number
103 is prime number
100 is not a prime number
105 is not a prime number
102 is not a prime number107 is prime number
104 is not a prime number
106 is not a prime number
108 is not a prime number
110 is not a prime number
109 is prime number
112 is not a prime number111 is not a prime number
113 is prime number114 is not a prime number
115 is not a prime number
116 is not a prime number
117 is not a prime number
118 is not a prime number
120 is not a prime number119 is not a prime number
121 is not a prime number
122 is not a prime number123 is not a prime number
124 is not a prime number
125 is not a prime number
126 is not a prime number
127 is prime number
128 is not a prime number
130 is not a prime number129 is not a prime number
132 is not a prime number
131 is prime number
133 is not a prime number
134 is not a prime number
135 is not a prime number
136 is not a prime number
139 is prime number
138 is not a prime number
137 is prime number
140 is not a prime number142 is not a prime number
141 is not a prime number
143 is not a prime number
145 is not a prime number
144 is not a prime number
146 is not a prime number147 is not a prime number
148 is not a prime number
149 is prime number
150 is not a prime number
151 is prime number
154 is not a prime number
152 is not a prime number153 is not a prime number
155 is not a prime number
156 is not a prime number
158 is not a prime number157 is prime number
159 is not a prime number
161 is not a prime number160 is not a prime number
162 is not a prime number
163 is prime number
164 is not a prime number
165 is not a prime number
167 is prime number166 is not a prime number
168 is not a prime number
169 is not a prime number
170 is not a prime number
171 is not a prime number
172 is not a prime number173 is prime number
174 is not a prime number
175 is not a prime number
176 is not a prime number
178 is not a prime number
179 is prime number
177 is not a prime number
181 is prime number
180 is not a prime number
183 is not a prime number182 is not a prime number
184 is not a prime number
185 is not a prime number186 is not a prime number
187 is not a prime number
188 is not a prime number
189 is not a prime number
190 is not a prime number
192 is not a prime number
191 is prime number
193 is prime number
194 is not a prime number
195 is not a prime number
196 is not a prime number197 is prime number
198 is not a prime number199 is prime number
Time taken = 2.24506902695 seconds
Process finished with exit code 0
Upvotes: 1