برنامهنویسی همزمان یکی از مهمترین تکنیکها در دنیای نرمافزار است که امکان اجرای چندین کار بهطور همزمان را فراهم میکند. در پایتون، همزمانی را میتوان با استفاده از چندنخی (Multithreading)، چندپردازشی (Multiprocessing) و برنامهنویسی ناهمگام (Asynchronous Programming) پیادهسازی کرد.
threading moduleبرای اجرای چندوظیفهای با استفاده از نخها، از ماژول threading در پایتون استفاده میکنیم:
import threadingimport timedef print_numbers():for i in range(5):time.sleep(1)print(f'Number: {i}')thread1 = threading.Thread(target=print_numbers)thread1.start()print("Main thread continues...")thread1.join()print("Thread finished!")
ویژگیهای threading
join()multiprocessing moduleبرای پردازشهای CPU محور، از ماژول multiprocessing استفاده میشود:
import multiprocessingdef square(n):return n * nif __name__ == "__main__":with multiprocessing.Pool(processes=4) as pool:numbers = [1, 2, 3, 4, 5]results = pool.map(square, numbers)print(results)
ویژگیهای multiprocessing
Pool برای پردازش دستهای دادههاasyncio برای برنامهنویسی ناهمگام (Asynchronous Programming)asyncio ماژولی برای اجرای کدهای ناهمگام است که به جای استفاده از نخها و فرآیندها، از کرونا (Coroutine) استفاده میکند. این روش برای وظایف I/O محور مانند ارتباطات شبکهای بسیار مؤثر است.
import asyncioasync def say_hello():await asyncio.sleep(1)print("Hello, Asyncio!")async def main():await asyncio.gather(say_hello(), say_hello())asyncio.run(main())
ویژگیهای asyncio
async و awaitgather()threading، multiprocessing و asyncio| ویژگی | Threading | Multiprocessing | Asyncio |
|---|---|---|---|
| مناسب برای | وظایف I/O محور | وظایف CPU محور | وظایف I/O محور |
| حافظه اشتراکی | بله | خیر | خیر |
| مدیریت منابع | کم | زیاد | کم |
| پیچیدگی | متوسط | بالا | پایین |
threading یا asyncio مناسبترند.multiprocessing گزینه بهتری است.asyncio کارآمدتر از threading برای عملیات I/O است، زیرا بدون قفل GIL اجرا میشود.با یادگیری این تکنیکها، میتوانید برنامههای پایتون خود را بهینه و کارآمدتر کنید!