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

Đa tiến trình (Multiprocessing) trong Python

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')