-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmp.py
55 lines (46 loc) · 1.53 KB
/
mp.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
from logging import logMultiprocessing
import time
import threading
import logging
import math
from multiprocessing.pool import Pool
import multiprocessing as mp
from multiprocessing.sharedctypes import Value
from os import getpid
import logboot
def do_cpu_intesive(num):
threading.currentThread().setName(f"cpu-{num}-{getpid()}")
i = 10_000_000
start = time.perf_counter()
logging.info(f"starting {i} iterations")
block_size = int(i / 10)
for it in range(1,i+1):
x = math.cos(99)
if it % block_size == 0:
iterations.value = iterations.value + block_size
logging.info(f"iteration={it:,} global={iterations.value:,}")
duration = round(time.perf_counter() - start, 2)
logging.info(f"done in {duration}")
return (num, duration)
def init_globals(it):
logging.info("init globals")
global iterations
iterations = it
def do_it_all(useFork=False):
start = time.perf_counter()
i = [1, 2]
global iterations
iterations = Value('i', 0)
if useFork:
mp.set_start_method("fork", True)
with Pool(processes=2, ) as p:
results = p.map(func=do_cpu_intesive, iterable=i)
else:
mp.set_start_method("spawn", True)
with Pool(processes=2, initializer=init_globals, initargs=[iterations]) as p:
results = p.map(func=do_cpu_intesive, iterable=i)
duration = round(time.perf_counter() - start, 2)
logging.info(f'Finished in {duration} seconds')
return results
if __name__ == '__main__':
do_it_all()