แพ็กเกจ 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 จัดการขนานและซิงโครไนซ์