Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Multiprocessing ใน Python (หลายกระบวนการ)

แพ็กเกจ multiprocessing รองรับการสร้างกระบวนการ (process) ใหม่ อ้างอิงฟังก์ชันที่โหลดและรันกระบวนการลูก (child process) กระบวนการปัจจุบันต้องรอให้ลูกจบหรือรันพร้อมกัน โดยใช้ API คล้ายโมดูล threading

แนวคิดพื้นฐาน

เริ่มต้นด้วยการสร้างออบเจ็กต์ Process แล้วเรียกเมธอด start()

ตัวอย่างพื้นฐาน

from multiprocessing import Process

def display():
    print('Hi !! I am Python')

if __name__ == '__main__':
    p = Process(target=display)
    p.start()
    p.join()

if __name__ == '__main__': จำเป็นใน Windows เพื่อป้องกันการสร้างกระบวนการซ้ำซ้อนแบบรูดูด

ส่งอาร์กิวเมนต์ให้ฟังก์ชัน

from multiprocessing import Process

def display(my_name):
    print('Hi !!! ' + my_name)

if __name__ == '__main__':
    p = Process(target=display, args=('Python',))
    p.start()
    p.join()

ตัวอย่าง: คำนวณเลขยกกำลังสามพร้อมกัน

from multiprocessing import Process

def cube(numbers):
    for x in numbers:
        print('%s cube is %s' % (x, x**3))

if __name__ == '__main__':
    my_numbers = [3, 4, 5, 6, 7, 8]
    p = Process(target=cube, args=(my_numbers,))
    p.start()
    p.join()
    print("Done")

ผลลัพธ์

3 cube is 27
4 cube is 64
5 cube is 125
6 cube is 216
7 cube is 343
8 cube is 512
Done

สร้างหลายกระบวนการพร้อมกัน

from multiprocessing import Process

def cube(numbers):
    for x in numbers:
        print('%s cube is %s' % (x, x**3))

def evenno(numbers):
    for x in numbers:
        if x % 2 == 0:
            print('%s is an even number' % x)

if __name__ == '__main__':
    my_numbers = [3, 4, 5, 6, 7, 8]
    p1 = Process(target=cube, args=(my_numbers,))
    p2 = Process(target=evenno, args=(my_numbers,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    print("Done")

ผลลัพธ์

3 cube is 27
4 cube is 64
5 cube is 125
6 cube is 216
7 cube is 343
8 cube is 512
4 is an even number
6 is an even number
8 is an even number
Done

การสื่อสารระหว่างกระบวนการ

Pipes (ท่อ)

from multiprocessing import Process, Pipe

def myfunction(conn):
    conn.send(['hi!! I am Python'])
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=myfunction, args=(child_conn,))
    p.start()
    print(parent_conn.recv())
    p.join()

Queues (คิว)


import multiprocessing

def evenno(numbers, q):
    for n in numbers:
        if n % 2 == 0:
            q.put(n)

if __name__ == "__main__":
    q = multiprocessing.Queue()
    p = multiprocessing.Process(target=evenno, args=(range(10), q))
    p.start()
    p.join()
    
    while not q.empty():
        print(q.get())

ผลลัพธ์ Queue

0
2
4
6
8

Locks (ล็อก) - ป้องกัน Race Condition

from multiprocessing import Process, Lock

def disp_name(l, i):
    l.acquire()
    print('Hi', i)
    l.release()

if __name__ == '__main__':
    my_lock = Lock()
    my_names = ['Aadrika', 'Adwaita', 'Sakya', 'Sanj']
    for name in my_names:
        Process(target=disp_name, args=(my_lock, name)).start()

Logging ใน Multiprocessing

import multiprocessing, logging

logger = multiprocessing.log_to_stderr()
logger.setLevel(logging.INFO)
logger.warning('Error has occurred')

สรุป: Multiprocessing เหมาะกับ CPU-bound tasks ใช้ Process, Pipe, Queue, Lock จัดการขนานและซิงโครไนซ์