Module multiprocessing cho phép tạo nhiều tiến trình (process) chạy song song thực sự, vượt qua GIL của threading. Phù hợp cho tác vụ CPU-bound.
Tạo tiến trình cơ bản
from multiprocessing import Process
def display(name):
print(f'Hi !!! {name}')
if __name__ == '__main__':
p = Process(target=display, args=('Python',))
p.start()
p.join()
Truyền đối số
def cube(x):
for n in x:
print(f'{n} cube is {n**3}')
if __name__ == '__main__':
numbers = [3,4,5,6,7,8]
p = Process(target=cube, args=(numbers,))
p.start()
p.join()
print("Done")
Nhiều tiến trình cùng lúc
def even_no(nums):
for n in nums:
if n % 2 == 0:
print(f'{n} is even')
if __name__ == '__main__':
numbers = [3,4,5,6,7,8]
p1 = Process(target=cube, args=(numbers,))
p2 = Process(target=even_no, args=(numbers,))
p1.start(); p2.start()
p1.join(); p2.join()
print("Done")
Giao tiếp giữa tiến trình
Pipe (điểm-điểm)
from multiprocessing import Process, Pipe
def sender(conn):
conn.send(['hi!! I am Python'])
conn.close()
if __name__ == '__main__':
parent, child = Pipe()
p = Process(target=sender, args=(child,))
p.start()
print(parent.recv()) # ['hi!! I am Python']
p.join()
Queue (nhiều tiến trình, an toàn)
import multiprocessing
def even_no(nums, q):
for n in nums:
if n % 2 == 0:
q.put(n)
if __name__ == '__main__':
q = multiprocessing.Queue()
p = multiprocessing.Process(target=even_no, args=(range(10), q))
p.start(); p.join()
while not q.empty():
print(q.get()) # 0 2 4 6 8
Lock (đồng bộ)
from multiprocessing import Process, Lock
def disp(lock, name):
lock.acquire()
print('Hi', name)
lock.release()
if __name__ == '__main__':
lock = Lock()
for name in ['Aadrika','Adwaita','Sakya','Sanj']:
Process(target=disp, args=(lock, name)).start()
Logging
import multiprocessing, logging
logger = multiprocessing.log_to_stderr()
logger.setLevel(logging.INFO)
logger.warning('Error has occurred')