Module multiprocessing cung cấp các primitive đồng bộ (Lock, Semaphore, Event...) và Pool để quản lý nhóm worker tiến trình.
Đồng bộ với Lock
from multiprocessing import Process, Lock
def worker(lock, num):
lock.acquire()
print('hello world', num)
lock.release()
if __name__ == '__main__':
lock = Lock()
for i in range(10):
Process(target=worker, args=(lock, i)).start()
Pool - Quản lý nhóm worker
from multiprocessing import Pool
import time
def square(x):
return x * x
if __name__ == '__main__':
with Pool(processes=4) as pool:
# apply_async: bất đồng bộ
res = pool.apply_async(square, (10,))
print(res.get(timeout=1)) # 100
# map: đồng bộ, trả list kết quả
print(pool.map(square, range(10))) # [0,1,4,9,16,25,36,49,64,81]
# imap: iterator, lazy evaluation
it = pool.imap(square, range(10))
print(next(it)) # 0
print(next(it)) # 1
print(next(it, timeout=1)) # 4
# Timeout demo
res = pool.apply_async(time.sleep, (10,))
try:
res.get(timeout=1)
except multiprocessing.TimeoutError:
print("Timeout!")
Các phương thức Pool chính
| Phương thức | Mô tả |
|---|---|
| apply(func, args) | Chạy func trong 1 worker, chờ kết quả (blocking) |
| apply_async(func, args, callback) | Chạy bất đồng bộ, trả AsyncResult |
| map(func, iterable) | Áp dụng func cho mỗi phần tử, trả list (blocking) |
| map_async(func, iterable) | Bất đồng bộ, trả AsyncResult |
| imap(func, iterable) | Iterator lazy, giữ thứ tự |
| imap_unordered(func, iterable) | Iterator lazy, không giữ thứ tự (nhanh hơn) |
| close() | Không nhận task mới, chờ worker hoàn tất |
| terminate() | Dừng ngay lập tức |
| join() | Chờ worker kết thúc (sau close/terminate) |
AsyncResult methods
get([timeout])– Lấy kết quả, ném TimeoutError nếu hết hạn.wait([timeout])– Chờ sẵn sàng.ready()– Kiểm tra xong chưa.successful()– Kiểm tra thành công không lỗi.