diff --git a/main.go b/main.go index 49f4dee..e945483 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,227 @@ package main -import "fmt" + + +import ( + + "fmt" + + "sync" + + "time" + +) + + + +type TaskStatus string + + + +const ( + + Pending TaskStatus = "Pending" + + Running TaskStatus = "Running" + + Completed TaskStatus = "Completed" + + Failed TaskStatus = "Failed" + +) + + + +type Task struct { + + ID int + + Status TaskStatus + +} + + + +type TaskRunner struct { + + mu sync.RWMutex + + tasks map[int]*Task + + completedCount int + +} + + + +func NewTaskRunner() *TaskRunner { + + return &TaskRunner{ + + tasks: make(map[int]*Task), + + } + +} + + + +func (tr *TaskRunner) AddTask(id int) { + + tr.mu.Lock() + + defer tr.mu.Unlock() + + tr.tasks[id] = &Task{ID: id, Status: Pending} + +} + + + +func (tr *TaskRunner) RunTask(id int) { + + tr.mu.Lock() + + task, ok := tr.tasks[id] + + if !ok { + + tr.mu.Unlock() + + return + + } + + task.Status = Running + + tr.mu.Unlock() + + + + // Simulate work + + time.Sleep(10 * time.Millisecond) + + + + tr.mu.Lock() + + defer tr.mu.Unlock() + + task.Status = Completed + + tr.completedCount++ + +} + + + +func (tr *TaskRunner) GetCompletedCount() int { + + tr.mu.RLock() + + defer tr.mu.RUnlock() + + return tr.completedCount + +} + + func main() { - fmt.Println("Hello, Bounty Hunter!") + + runner := NewTaskRunner() + + var wg sync.WaitGroup + + + + numTasks := 100 + + for i := 0; i < numTasks; i++ { + + runner.AddTask(i) + + wg.Add(1) + + go func(id int) { + + defer wg.Done() + + runner.RunTask(id) + + }(i) + + } + + + + wg.Wait() + + fmt.Printf("Successfully completed %d tasks\n", runner.GetCompletedCount()) + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +