แก้ไขข้อบกพร่องการประมวลผลหลายอย่างใน Python


คำตอบ:


6

โปรแกรม Python หลายตัวประมวลผลที่แท้จริง (ตรงข้ามกับโปรแกรม Python แบบมัลติเธรดซึ่งต้องจัดการกับGIL ที่หวั่นเกรง) จะไม่แตกต่างจากโปรแกรมภาษาอื่น ๆ พวกเขาล้วนมีความท้าทายพื้นฐานเหมือนกัน:

  1. การมอบหมายงานและการรายงานผล แม้ว่าพวกเขาส่วนใหญ่ทำงานบนชุดข้อมูลที่เป็นอิสระพวกเขามักจะต้องกลับไปที่เธรดหลักเพื่อรายงานผลลัพธ์และรับข้อมูลใหม่เพื่อทำงาน นี่อาจเป็นจุดที่ทำให้หายใจไม่ออก
  2. สภาพการแข่งขัน กระบวนการกำลังพยายามใช้ทรัพยากรแบบครั้งต่อครั้งและพวกเขาจำเป็นต้องใช้ mutex (หรือบางอย่างที่คล้ายคลึงกัน) เพื่อป้องกันไม่ให้ข้อมูลทั้งหมดมารวมกัน ความล้มเหลวในการปกป้องทรัพยากรประเภทนี้สามารถนำไปสู่เซสชันการดีบักที่เจ็บปวดจริงๆ
  3. จัดลำดับ บางครั้งคุณกำลังพยายามทำสิ่งที่ขนานที่ไม่ใช่ กระบวนการต่าง ๆ จบลงด้วยการรอคอยซึ่งกันและกันเพื่อทำบางสิ่งและผลลัพธ์ที่ได้คือคุณมีโปรแกรมตามลำดับทำแบบขนานและมันยังจบลงด้วยการใช้เวลาเชิงเส้น (หรือแย่กว่า)

แม้ว่าจะมีวิธีการพัฒนาที่พยายามหลีกเลี่ยงปัญหาเหล่านี้ แต่สุดท้ายแล้วคุณต้องคิดจริงๆเกี่ยวกับสิ่งที่คุณทำ ฉันขอแนะนำการทดสอบความเครียดอย่างหนัก - เหนือสิ่งอื่นใดที่คุณคิดว่าอาจเกิดขึ้นในชีวิตจริง - เพื่อให้คุณมีโอกาสที่ดีที่จะกดปุ่ม Windows of Opportunity เหล่านั้นและระเบิดขึ้นในการพัฒนาซึ่งตรงข้าม

เราเคยใช้ไฟล์บันทึก microsecond-timestamped จากนั้นสร้างแอปดูบันทึกสีเพื่อให้เราสามารถลองจินตนาการถึงสิ่งที่เกิดขึ้นระหว่างกระบวนการ N ที่ทำงานบนโปรเซสเซอร์ M นอกจากนี้เรายังพยายาม (และประสบความสำเร็จเป็นส่วนใหญ่) ในการสร้างระบบที่จะขับออกจากไฟล์บันทึกเพื่อสร้างบริบทของความผิดพลาดอีกครั้ง

แต่เครื่องมือที่ดีที่สุดคือการออกแบบที่ดีและชั่วร้ายจริง ๆ คนที่น่ารังเกียจที่พยายามเป่าแอปของคุณออกจากน้ำ (สวัสดีเดล!)


26

สิ่งหนึ่งที่ฉันพบว่ามีประโยชน์มากคือใช้ตัวบันทึกที่มีอยู่ในmultiprocessingโมดูล ลองใช้ในรหัสหลักของคุณ:

import multiprocessing, logging
mpl = multiprocessing.log_to_stderr()
mpl.setLevel(logging.INFO)

ดูเพิ่มเติมที่: http://docs.python.org/library/multiprocessing.html#logging

นอกจากนี้คุณสามารถเข้าถึงชื่อกระบวนการปัจจุบันโดยใช้:

cpname = multiprocessing.current_process().name
# print cpname
mylogger.info("{0} is currently doing...".format(cpname))

โปรดดู: http://docs.python.org/library/multiprocessing.html#multiprocessing.current_process

นอกเหนือจากนั้นฉันไม่รู้อะไรเลยนอกจากวิธีการแก้จุดบกพร่องมาตรฐานเช่นpdb& co

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.