简体   繁体   中英

Multiprocessing does not run functions

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!

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

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) (eg 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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM