עיבוד אסינכרוני ב-Python
מאמר זה מסביר עיבוד אסינכרוני ב-Python.
תוכלו ללמוד דוגמאות קוד לשימוש בסיסי ב-async/await ובמודול asyncio של Python.
YouTube Video
עיבוד אסינכרוני ב-Python
עיבוד אסינכרוני בפייתון הוא מנגנון לטיפול יעיל בפעולות קלט/פלט גוזלות-זמן, כגון קריאה וכתיבה של קבצים או תקשורת רשת. בעיבוד סינכרוני, הפעולה הבאה ממתינה עד שהנוכחית מסתיימת, אך בעיבוד אסינכרוני, ניתן להמשיך בפעולות נוספות בזמן ההמתנה. בפייתון, המודול asyncio מסופק לצורך עיבוד אסינכרוני. כאן נסביר את הרכיבים הבסיסיים שלו ואיך להשתמש בהם שלב אחר שלב.
תחביר בסיסי
בלב העיבוד האסינכרוני נמצאות פונקציות הנקראות קורוטינות. פונקציות async מגדירות פונקציות אסינכרוניות, ו-await משמשת להמתנה למשימה אסינכרונית בתוך פונקציות אלה.
1import asyncio
2
3async def say_hello():
4 print("Hello")
5 await asyncio.sleep(1)
6 print("World")
7
8if __name__ == "__main__":
9 # Execute asynchronous task
10 asyncio.run(say_hello())- בקוד שלמעלה, הפונקציה
say_helloמוגדרת כמשימה אסינכרונית. בזמן ההמתנה של שנייה אחת עם sleep(), משימות אסינכרוניות אחרות יכולות להתבצע.
ביצוע משימות מרובות
על ידי שימוש בפונקציית gather של המודול asyncio, ניתן להפעיל מספר משימות בו-זמנית.
1import asyncio
2
3async def task1():
4 print("Task 1 started")
5 await asyncio.sleep(2)
6 print("Task 1 completed")
7
8async def task2():
9 print("Task 2 started")
10 await asyncio.sleep(1)
11 print("Task 2 completed")
12
13async def main():
14 await asyncio.gather(task1(), task2())
15
16if __name__ == "__main__":
17 asyncio.run(main())- בדוגמה זו,
task1ו-task2מבוצעות במקביל. כתוצאה מכך,task2מושלמת ראשונה משתי המשימות, אך זמן הביצוע הכולל שווה לזמן הביצוע של המשימה הארוכה ביותר.
ניהול שגיאות
טיפול בשגיאות הוא חשוב גם בעיבוד אסינכרוני. ניתן לתפוס ולטפל בשגיאות באמצעות תחביר ה-try-except הסטנדרטי.
1import asyncio
2
3async def faulty_task():
4 raise Exception("An error occurred")
5
6async def main():
7 try:
8 await faulty_task()
9 except Exception as e:
10 print(f"Caught an error: {e}")
11
12if __name__ == "__main__":
13 asyncio.run(main())- קוד זה מדגים כיצד ניתן לטפל ולתפוס חריגות (יוצאי דופן) שמתרחשות בתוך פונקציות אסינכרוניות בעזרת
try-exceptולטפל בהודעות השגיאה בצורה בטוחה. החריגה מ-faulty_taskנתפסת בתוךmainומוצאה בצורה הולמת.
סיכום
עיבוד אסינכרוני בפייתון משתמש ב-async / await וב-asyncio כדי להריץ משימות נוספות במקביל בזמן ההמתנה ל-I/O, וכך מאפשר עיבוד יעיל. על ידי ניצול ביצוע במקביל של מספר משימות ו-I/O אסינכרוני, ניתן לשפר את הביצועים בצורה משמעותית. בנוסף, מאחר שניתן לטפל בטעויות בדיוק כמו בעזרת try-except רגיל, ניתן להריץ קוד אסינכרוני בצורה בטוחה.
תוכלו לעקוב אחר המאמר שלמעלה באמצעות Visual Studio Code בערוץ היוטיוב שלנו. נא לבדוק גם את ערוץ היוטיוב.