כיצד ליישם בצורה הטובה ביותר ריבוי עיבוד בפייתון?



מאמר זה יכיר לכם את Multiprocessing ב- Python ובתהליך גם יביא לכם הדגמה פרוגרמטית.

שנת 2019 הייתה שנה גדולה מאוד להתפתחות טכנולוגית בכל רחבי העולם. החל מיצרני מחשבים שמוסיפים ליבות נוספות למעבדים ולמעבדים שלהם להשקת שבבים חכמים יותר בטלפונים ניידים, עיבוד רב-תכליתי כבר אינו חלום. כיום, אחת משפות התכנות הבולטות ביותר התומכות ברב-עיבוד היא . הודות להכנסת כוח העיבוד המקביל במהדורתו, קודנים ברחבי העולם יכולים כעת ליצור בצורה חלקה קודים שיבוצעו בו זמנית ובכך את זמן הריצה שלהם בכמות משמעותית.

המצביעים הבאים יוסקרו במאמר זה,





כיצד ליצור קבצי יומן

הבה נתחיל,

עיבוד רב בפייתון

מה זה ריבוי עיבוד?

ניתן להגדיר פשוט עיבוד רב כיכולתה של מערכת לתמוך ביותר מפעולה אחת בכל מקרה נתון. משמעות הדבר היא שיישומים במערכות עיבוד מרובות מתפרקים לחתיכות קטנות ואז פועלים באופן עצמאי זה על מנת להגביר את היעילות ולהפחית את זמן הריצה הכללי. המעבד במערכת מקצה לכל חלק קטן חוט עצמאי בפני עצמו, וכך מאפשר לו לתפקד כישות עצמאית.



הצורך בעיבוד רב

תארו לעצמכם מערכת מחשב שיש בה רק ליבה אחת במעבד שלה. אם מוקצות מספר משימות לליבה יחידה זו, היא מפסקת כל משימה ביניהן ואז עוברת למחרת. זה לא יגדיל את משך הזמן הדרוש להשלמת כל משימה, אלא גם יפחית את היעילות הכוללת של המערכת.

מצד שני, מחשב מרובה עיבודים יכול להכיל מעבד אחד שבתוכו יש מספר יחידות מתפקדות, הנקראות ליבות בודדות אשר יכולות להריץ מספר משימות שונות באופן עצמאי בו זמנית. זה לא רק מגביר את יעילות המערכת אלא גם בטווח הארוך מקטין את זמן הריצה של המערכת בכמות משמעותית.



מערכת רב-עיבוד בפייתון יכולה להיות משני סוגים.

מערכת רב מעבדים

מערכת זו כוללת למעשה מספר מעבדים מתחת למכסה המנוע שלה, שכל אחד מהם יכול לבצע משימה אחת בכל פעם ולתפקד כמרכיב עצמאי.

מערכת מעבדים מרובת ליבות

למערכת זו מספר ליבות הקיימות באותו מעבד, במסגרתן הליבה מתפקדת כיחידה נפרדת ומבצעת משימות באופן עצמאי המוקצות לה.

קוד לעיבוד רב בפייתון

עכשיו כשאתם רגילים לתפיסה הבסיסית של ריבוי עיבוד, הבה נבדוק כיצד ניתן להשיג ריבוי עיבוד בפייתון.

בפייתון, המתורגמן מכיל ממשק API פשוט מאוד ואינטואיטיבי שלוקח משימה אחת, מפרק אותה למספר רכיבים ומעבד אותם באופן עצמאי.

התבונן במודול התוכנית שלמטה כדי להבין טוב יותר את המושג הזה של עיבוד רב בפייתון.

דוגמה 1

# ייבוא ​​מודול המעבד יבוא רב עיבוד def print_cube (num): פונקציה '' 'להדפסת קוביה של מספר נתון' '' print ('קוביה: {}'. פורמט (num * num * num)) def print_square (num): פונקציה '' להדפסת ריבוע של מספר נתון '' '' הדפסה ('ריבוע: {}'. פורמט (num * num)) אם __name__ == '__main__': # יצירת תהליכים p1 = multiprocessing.Process (target = print_square, args = (10,)) p2 = multiprocessing.Process (target = print_cube, args = (10,)) # התחלת תהליך 1 p1.start () # תהליך התחלה 2 p2.start () # המתן עד שתהליך 1 יסתיים p1 .join () # המתן עד לסיום תהליך 2 p2.join () # שני התהליכים סיימו את ההדפסה ('בוצע!')

תְפוּקָה

כיכר: 100

קוביה: 1000

בוצע!

עכשיו בואו ננתח את התוכנית הזו כדי להבין אותה טוב יותר.

  1. השלב הראשון הוא ייבוא ​​המודול המרובה-עיבוד. על מנת לעשות זאת, השתמש בתחביר הבא: ייבוא ​​רב-עיבוד.

  2. כעת, לאחר שיובא מודול העיבוד הרב-תכליתי, הבה נתקדם וייצור תהליך. על מנת לעשות זאת, אנו יוצרים אובייקט של מחלקת התהליך ומקצים לו את הטיעונים הבאים. יעד: הפונקציה שצריך לבצע בתהליך זה וטוענת: הטיעונים שצריך להעביר לפונקציית היעד.

הערה: לבונה תהליכים יש את היכולת לקחת על עצמו יעדים מרובים כמו גם ארגומנטים, אך בדוגמה שלמעלה הקצנו לתהליך שלנו רק שני יעדים וטיעונים כמוצג להלן.

p1 = ריבוי עיבוד. תהליך (target = print_square, args = (10,))

p2 = multiprocessing.Process (target = print_cube, args = (10,))

  1. כעת לאחר שנוצר התהליך, בואו נכתוב את התחביר להתחלת אותו.

p1.start ()

p2.start ()

לאחר תחילת התהליך, התוכנית הנוכחית והתוכנית שמבוצעת כבר מופעלים בו זמנית. אם במצב מסוים, עליך להפסיק את ביצוע התוכנית הנוכחית ולהתמקד רק בביצוע התוכנית הקיימת, אנו משתמשים בפונקציית ההצטרפות כמוצג להלן.

p1.join ()

p2.join ()

לאחר שתזין תחביר זה, המתורגמן ימתין לתוכנית p1 לסיום הביצוע ואז יעבור לתוכנית p2.

כדי להבין את המושג הזה עוד יותר, עיין בדוגמה אחרת עבור Multiprocessing In Python להלן.

דוגמה 2

# ייבוא ​​המודול מרובה עיבוד ייבוא ​​רב עיבוד ייבוא ​​os def עובד 1 (): # הדפסת מזהה תהליך ('מזהה התהליך פועל עובד 1: {}'. פורמט (os.getpid ())) def עובד 2 (): # הדפסת מזהה תהליך הדפסה ('מזהה של התהליך שמריץ עובד 2: {}'. פורמט (os.getpid ())) אם __name__ == '__main__': # הדפסת מזהה התהליך הראשי של התוכנית ('מזהה התהליך הראשי: {}'. פורמט (os .getpid ())) # יצירת תהליכים p1 = multiprocessing.Process (target = worker1) p2 = multiprocessing.Process (target = worker2) # תהליכי התחלה p1.start () p2.start () # מזהי תהליך מודפסים ('מזהה של תהליך p1: {} '. פורמט (p1.pid)) הדפס (' מזהה של תהליך p2: {} '. פורמט (p2.pid)) # המתן עד לסיום התהליכים p1.join () p2.join () # שני התהליכים סיימו את ההדפסה ('שני התהליכים סיימו את הביצוע!') # בדוק אם התהליכים חיים הדפס ('התהליך p1 חי: {}'. פורמט (p1.is_alive ())) הדפס ('התהליך p2 חי: {} '. פורמט (p2.is_alive ()))

תְפוּקָה

תעודת זהות של התהליך העיקרי: 18938

תעודת זהות של עובד העובד 1: 18939

הגדרת מסלול כיתה עבור

תעודת זהות של עובד הפועל בתהליך 2: 18940

תעודת זהות של התהליך p1: 18939

מזהה תהליך p2: 18940

שני התהליכים סיימו את הביצוע!

תהליך p1 חי: שקר

תהליך p2 חי: שקר

שימו לב בתוכנית שלעיל כי התהליך p1 ו- p2 פועלים ללא תלות בזיכרונותיהם האישיים. ברגע ששניהם סיימו את הביצוע, התוכנית הופסקה.

זה מביא אותנו לסוף מאמר זה בנושא ריבוי עיבודים בפייתון

כדי לקבל ידע מעמיק על Python יחד עם היישומים השונים שלו, אתה יכול לאימונים מקוונים חיים עם תמיכה 24/7 וגישה לכל החיים.

יש לך שאלה עבורנו? הזכר אותם בסעיף ההערות במאמר ונחזור אליך.