تفاوت Concurrency و Parallelism؛ همزمانی در برابر موازیسازی به زبان ساده
17 تیر 1405دو واژهای که اغلب اشتباه گرفته میشوند: همزمانی (Concurrency) و موازیسازی (Parallelism). هرچند شبیه بهنظر میرسند، مفاهیم متفاوتی هستند. در این مقاله تفاوت آنها و مفاهیم Process، Thread و Coroutine را روشن میکنیم.

همزمانی (Concurrency) چیست؟
همزمانی یعنی مدیریت چند کار در یک بازهٔ زمانی، نه لزوماً در یک لحظه. سیستم بهسرعت بین کارها جابهجا میشود طوریکه انگار همزمان پیش میروند. مثل آشپزی که همزمان چند غذا را با جابهجایی بین آنها مدیریت میکند.
موازیسازی (Parallelism) چیست؟
موازیسازی یعنی اجرای واقعاً همزمان چند کار در یک لحظه، روی چند هستهٔ پردازنده. مثل چند آشپز که هرکدام جداگانه یک غذا میپزند. موازیسازی به سختافزار چندهستهای نیاز دارد.
تفاوت اصلی
همزمانی دربارهٔ ساختار برنامه است (چطور کارها را تقسیم کنیم)، موازیسازی دربارهٔ اجرای همزمان. میتوان همزمانی داشت بدون موازیسازی (یک هسته)، و موازیسازی نوعی از همزمانی است که واقعاً همزمان اجرا میشود.
Process، Thread و Coroutine
Process: یک برنامهٔ مستقل با حافظهٔ جداگانه؛ امن اما سنگین. Thread: نخی سبکتر درون یک process که حافظه را به اشتراک میگذارد؛ سریعتر اما نیازمند مدیریت دقیق. Coroutine: واحد سبک همزمانی در سطح زبان (مثل async در پایتون و جاوااسکریپت) که بدون سربار نخ سیستمی، همزمانی بالا میدهد.
چه زمانی کدام؟
برای کارهای I/O-bound (شبکه، دیتابیس) همزمانی با coroutine عالی است. برای کارهای CPU-bound (محاسبات سنگین) موازیسازی با چند process یا thread نتیجه میدهد.
پرسشهای متداول
آیا async در جاوااسکریپت موازی است؟ نه؛ جاوااسکریپت تکنخی است و async آن همزمانی است نه موازیسازی واقعی.
جمعبندی
همزمانی یعنی «سروکلهزدن با چند کار»، موازیسازی یعنی «انجام همزمان چند کار». انتخاب درست بین Process، Thread و Coroutine به نوع بار کاری (I/O یا CPU) بستگی دارد.