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

การประมวลผลหลายตัวใน Python


แพ็คเกจการประมวลผลหลายตัวรองรับกระบวนการวางไข่ หมายถึงฟังก์ชันที่โหลดและดำเนินการโปรเซสลูกใหม่ เพื่อให้ชายด์ยุติหรือดำเนินการประมวลผลพร้อมกันต่อไป กระบวนการปัจจุบันต้องรอโดยใช้ API ซึ่งคล้ายกับโมดูลเธรด

แนะนำตัว

เมื่อเราทำงานกับ Multiprocessing ขั้นแรกเราจะสร้างกระบวนการ วัตถุ. จากนั้นเรียกใช้เมธอด start()

โค้ดตัวอย่าง

from multiprocessing import Process
   def display():
      print ('Hi !! I am Python')
      if __name__ == '__main__':
      p = Process(target=display)
      p.start()
      p.join()

ในตัวอย่างนี้ ขั้นแรก เรานำเข้าคลาส Process จากนั้นเริ่มอ็อบเจ็กต์ Process ด้วยฟังก์ชัน display()

จากนั้นโปรเซสจะเริ่มต้นด้วยเมธอด start() และจากนั้นทำกระบวนการให้เสร็จสิ้นด้วยเมธอด join()

นอกจากนี้เรายังสามารถส่งอาร์กิวเมนต์ไปยังฟังก์ชันได้โดยใช้คีย์เวิร์ด args

ตัวอย่าง

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(x):
      for x in my_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=('x',))
         p.start()
p.join
print ("Done")

ผลลัพธ์

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

นอกจากนี้เรายังสามารถสร้างกระบวนการได้มากกว่าหนึ่งขั้นตอนในแต่ละครั้ง

ในตัวอย่างนี้ ในตอนแรก เราสร้างกระบวนการหนึ่งซึ่งก็คือ process1 กระบวนการนี้เพียงแค่คำนวณลูกบาศก์ของตัวเลข และในขณะเดียวกัน กระบวนการที่สอง process2 กำลังตรวจสอบว่าตัวเลขนี้เป็นเลขคู่หรือคี่

ตัวอย่าง

from multiprocessing import Process
def cube(x):
   for x in my_numbers:
   print('%s cube is %s' % (x, x**3))
def evenno(x):
   for x in my_numbers:
   if x % 2 == 0:
   print('%s is an even number ' % (x))
   if __name__ == '__main__':
      my_numbers = [3, 4, 5, 6, 7, 8]
      my_process1 = Process(target=cube, args=('x',))
      my_process2 = Process(target=evenno, args=('x',))
      my_process1.start()
      my_process2.start()
      my_process1.join()
   my_process2.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 and Queues ซึ่งเป็นช่องทางการสื่อสารสองประเภทระหว่างกระบวนการ

ท่อ

ในการประมวลผลหลายตัว เมื่อเราต้องการสื่อสารระหว่างกระบวนการ ในสถานการณ์นั้น ท่อ ถูกนำมาใช้

ตัวอย่าง

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

ผลลัพธ์

['hi !!! I am Python']

ท่อส่งกลับวัตถุเชื่อมต่อสองชิ้นและสิ่งเหล่านี้เป็นตัวแทนของปลายทั้งสองของท่อ แต่ละอ็อบเจ็กต์การเชื่อมต่อมีสองวิธีที่หนึ่งคือ send() และอีกวิธีหนึ่งคือ recv() วิธีการ

ในตัวอย่างนี้ ขั้นแรก เราสร้างกระบวนการและกระบวนการนี้จะพิมพ์ข้อความ "สวัสดี!! ฉันคือ Python" จากนั้นจึงแชร์ข้อมูลไปทั่ว

คิว

เมื่อเราส่งข้อมูลระหว่างกระบวนการ ณ เวลานั้น เราก็สามารถใช้ Queue object ได้

ตัวอย่าง

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 q:
print(q.get())

ผลลัพธ์

0
2
4
6
8

ในตัวอย่างนี้ ขั้นแรกให้สร้างฟังก์ชันที่ตรวจสอบสภาพอากาศว่าตัวเลขเป็นเลขคู่หรือไม่ หากตัวเลขเป็นเลขคู่ ให้ใส่ที่ท้ายคิว จากนั้นเราสร้างวัตถุคิวและวัตถุกระบวนการ จากนั้นเราเริ่มกระบวนการ

และสุดท้ายตรวจสอบว่าคิวว่างหรือไม่

เมื่อเราพิมพ์ตัวเลข ตอนแรกเราจะพิมพ์ค่าที่อยู่ข้างหน้าคิวแล้วตามด้วยค่าถัดไปเป็นต้น

ล็อค

เมื่อเราต้องการให้มีการดำเนินการเพียงครั้งเดียวในสถานการณ์นั้น Locks จะถูกใช้งาน นั่นหมายความว่าเวลาบล็อกกระบวนการอื่นจากการรันโค้ดที่คล้ายกัน การล็อกจะถูกปล่อยหลังจากกระบวนการเสร็จสิ้น

ตัวอย่างการใช้วิธีการล็อก

ตัวอย่าง

from multiprocessing import Process, Lock
def dispmay_name(l, i):
l.acquire()
print ('Hi', i)
   l.release()
if __name__ == '__main__':
   my_lock = Lock()
   my_name = ['Aadrika', 'Adwaita', 'Sakya', 'Sanj']
for name in my_name:
Process(target=dispmay_name, args=(my_lock,name)).start()

ผลลัพธ์

Hi Aadrika
Hi Adwaita
Hi Sakya
Hi Sanj

การบันทึก

โมดูลการประมวลผลหลายตัวยังมีโมดูลการบันทึกเพื่อให้แน่ใจว่าหากแพ็คเกจการบันทึกไม่ได้ใช้ฟังก์ชั่นล็อค ข้อความระหว่างกระบวนการจะปะปนกันระหว่างการดำเนินการ

ตัวอย่าง

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

ในตัวอย่างนี้ ในตอนแรก เรานำเข้าโมดูลการบันทึกและการประมวลผลหลายตัว จากนั้นเราจะใช้วิธี multiprocessing.log_to_stderr() และเรียก get_logger() รวมทั้งเพิ่มใน sys.stderr และสุดท้ายเรากำหนดระดับของตัวบันทึกและถ่ายทอดข้อความ