Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Đồng bộ và Pool tiến trình trong Python Multiprocessing

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ứcMô 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.