Note
Go to the end to download the full example code.
12.3.10.5.1. Multi processing#
This is a modified example from the python documentation.
The only difference is the set_executable
section at the start.
Please notice that you cannot use methods from the itom module
in any worker thread.
Alternative approaches for multiprocessing are
python threading
module and asyncio
. Or use subprocess
.
from multiprocessing import Pool, TimeoutError
import multiprocessing
import time
import os
Demo function for parallelization.
def func(x):
print("return x*x with x = ", x)
return x * x
Python executable is required
pythonPath = ui.getOpenFileName(
"Set path of python.exe",
"C:/itom/3rdParty/Python/python.exe",
"Python Executable (*.exe)",
)
if pythonPath and os.path.exists(pythonPath):
# set the path of the python executable (embedded python is required)
multiprocessing.set_executable(pythonPath)
with Pool(processes=4) as pool:
# print "[0, 1, 4,..., 81]"
print(pool.map(func, range(10)))
# print same numbers in arbitrary order
for i in pool.imap_unordered(func, range(10)):
print(i)
# evaluate "f(20)" asynchronously
res = pool.apply_async(func, (20,)) # runs in *only* one process
print(res.get(timeout=1)) # prints "400"
# evaluate "os.getpid()" asynchronously
res = pool.apply_async(os.getpid, ()) # runs in *only* one process
print(res.get(timeout=1)) # prints the PID of that process
# launching multiple evaluations asynchronously *may* use more processes
multiple_results = [pool.apply_async(os.getpid, ()) for i in range(4)]
print([res.get(timeout=1) for res in multiple_results])
# make a single worker sleep for 10 secs
res = pool.apply_async(time.sleep, (10,))
try:
print(res.get(timeout=1))
except TimeoutError:
print("We lacked patience and got a multiprocessing.TimeoutError")
print("For the moment, the pool remains available for more work")
# exiting the 'with'-block has stopped the pool
print("Now the pool is closed and no longer available")