26 lines
1.9 KiB
Markdown
26 lines
1.9 KiB
Markdown
### Задача 10. Многопоточность и очереди (Threading, Queue, Синхронизация)
|
||
|
||
Напишите программу для обработки задач в нескольких потоках:
|
||
|
||
1. **Класс `Worker`:**
|
||
- В `__init__(self, name, queue)` сохраните имя рабочего и очередь задач
|
||
- Метод `run(self)` — бесконечный цикл: берет задачу из очереди (`queue.get()`), обрабатывает её (просто выводит `"Worker {name} обрабатывает: {task}"`), делает `time.sleep(1)` для имитации работы, затем вызывает `queue.task_done()`
|
||
|
||
2. `create_workers(count, queue)` — создает `count` объектов `Worker`, запускает каждого в отдельном потоке (`threading.Thread`) с `daemon=True`. Возвращает список потоков.
|
||
|
||
3. `process_tasks(tasks, worker_count=3)` — принимает список задач:
|
||
- Создает очередь `queue.Queue()`
|
||
- Добавляет все задачи в очередь
|
||
- Создает рабочих через `create_workers`
|
||
- Ждет завершения всех задач через `queue.join()`
|
||
- Выводит *"Все задачи обработаны"*
|
||
|
||
**Тесты:**
|
||
|
||
1. Создайте список из 10 задач: `["Задача 1", "Задача 2", ..., "Задача 10"]`
|
||
2. Запустите обработку с 3 рабочими потоками
|
||
3. Убедитесь, что задачи распределяются между потоками
|
||
4. Замерьте время выполнения (должно быть ~4 секунды для 10 задач с 3 потоками)
|
||
|
||
**Подсказка:** Импортируйте `import threading`, `import queue`, `import time`.
|