💠تفاوت Concurrency و Parallelism💠
این دو، مفاهیمی کلیدی در برنامهنویسی هستند که به نحوه اجرای همزمان وظایف اشاره دارند، اما تفاوتهای مهمی بین آنها وجود دارد.
Concurrency (همزمانی)
به توانایی یک سیستم برای مدیریت چندین کار به طور همزمان اشاره دارد. در این حالت، ممکن است که چندین کار به طور همزمان در حال اجرا نباشند، اما سیستم میتواند به صورت مؤثر بین آنها سوئیچ کند. در واقع، concurrency بیشتر به طراحی و ساختار برنامه مربوط میشود تا به اجرای واقعی.
Parallelism (موازیسازی)
به اجرای همزمان چندین کار در زمان واقعی اشاره دارد. این مفهوم معمولاً در سیستمهایی با چندین هسته پردازشی (multi-core) مورد استفاده قرار میگیرد، جایی که میتوان چندین کار را به طور واقعی و همزمان اجرا کرد.
مثالها
مثال با C
در C، میتوان از کتابخانه pthread برای پیادهسازی concurrency و parallelism استفاده کرد.
Concurrency با استفاده از pthread:
#include
#include
#include
void* task(void* arg) {
printf("Task %d is running\n", *(int*)arg);
sleep(1);
printf("Task %d is done\n", *(int*)arg);
return NULL;
}
int main() {
pthread_t threads[3];
int task_ids[3] = {1, 2, 3};
for (int i = 0; i < 3; i++) {
pthread_create(&threads[i], NULL, task, &task_ids[i]);
}
for (int i = 0; i < 3; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
در این مثال، سه وظیفه به طور همزمان ایجاد میشوند و هر کدام برای یک ثانیه اجرا میشوند. این مثال نشاندهنده concurrency است، زیرا وظایف به صورت همزمان مدیریت میشوند.
Parallelism با استفاده از pthread:
#include
#include
#include
void* task(void* arg) {
printf("Task %d is running\n", *(int*)arg);
sleep(1);
printf("Task %d is done\n", *(int*)arg);
return NULL;
}
int main() {
pthread_t threads[3];
int task_ids[3] = {1, 2, 3};
for (int i = 0; i < 3; i++) {
pthread_create(&threads[i], NULL, task, &task_ids[i]);
}
for (int i = 0; i < 3; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
در این مثال نیز، وظایف به صورت موازی اجرا میشوند و اگر سیستم دارای چندین هسته باشد، هر وظیفه میتواند بر روی هستهای جداگانه اجرا شود.
مثال با Go (Golang)
در Go، concurrency به سادگی با goroutines و channels پیادهسازی میشود.
Concurrency با استفاده از goroutines:
package main
import (
"fmt"
"time"
)
func task(id int) {
fmt.Printf("Task %d is running\n", id)
time.Sleep(1 * time.Second)
fmt.Printf("Task %d is done\n", id)
}
func main() {
for i := 1; i
این دو، مفاهیمی کلیدی در برنامهنویسی هستند که به نحوه اجرای همزمان وظایف اشاره دارند، اما تفاوتهای مهمی بین آنها وجود دارد.
Concurrency (همزمانی)
به توانایی یک سیستم برای مدیریت چندین کار به طور همزمان اشاره دارد. در این حالت، ممکن است که چندین کار به طور همزمان در حال اجرا نباشند، اما سیستم میتواند به صورت مؤثر بین آنها سوئیچ کند. در واقع، concurrency بیشتر به طراحی و ساختار برنامه مربوط میشود تا به اجرای واقعی.
Parallelism (موازیسازی)
به اجرای همزمان چندین کار در زمان واقعی اشاره دارد. این مفهوم معمولاً در سیستمهایی با چندین هسته پردازشی (multi-core) مورد استفاده قرار میگیرد، جایی که میتوان چندین کار را به طور واقعی و همزمان اجرا کرد.
مثالها
مثال با C
در C، میتوان از کتابخانه pthread برای پیادهسازی concurrency و parallelism استفاده کرد.
Concurrency با استفاده از pthread:
#include
#include
#include
void* task(void* arg) {
printf("Task %d is running\n", *(int*)arg);
sleep(1);
printf("Task %d is done\n", *(int*)arg);
return NULL;
}
int main() {
pthread_t threads[3];
int task_ids[3] = {1, 2, 3};
for (int i = 0; i < 3; i++) {
pthread_create(&threads[i], NULL, task, &task_ids[i]);
}
for (int i = 0; i < 3; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
در این مثال، سه وظیفه به طور همزمان ایجاد میشوند و هر کدام برای یک ثانیه اجرا میشوند. این مثال نشاندهنده concurrency است، زیرا وظایف به صورت همزمان مدیریت میشوند.
Parallelism با استفاده از pthread:
#include
#include
#include
void* task(void* arg) {
printf("Task %d is running\n", *(int*)arg);
sleep(1);
printf("Task %d is done\n", *(int*)arg);
return NULL;
}
int main() {
pthread_t threads[3];
int task_ids[3] = {1, 2, 3};
for (int i = 0; i < 3; i++) {
pthread_create(&threads[i], NULL, task, &task_ids[i]);
}
for (int i = 0; i < 3; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
در این مثال نیز، وظایف به صورت موازی اجرا میشوند و اگر سیستم دارای چندین هسته باشد، هر وظیفه میتواند بر روی هستهای جداگانه اجرا شود.
مثال با Go (Golang)
در Go، concurrency به سادگی با goroutines و channels پیادهسازی میشود.
Concurrency با استفاده از goroutines:
package main
import (
"fmt"
"time"
)
func task(id int) {
fmt.Printf("Task %d is running\n", id)
time.Sleep(1 * time.Second)
fmt.Printf("Task %d is done\n", id)
}
func main() {
for i := 1; i