def worker(x):
if x % 2 == 0: items.append(x*2)
threads = [Thread(target=worker, args=(i,)) for i in range(100)]

22 Дек 2025 в 06:10
18 +1
0
Ответы
1
Кратко — что не так и как исправить.
Проблемы в исходном фрагменте
- Не определён список `items` и не импортирован `Thread`.
- Потоки созданы, но не запущены и не синхронизированы (`start()`/`join()` отсутствуют).
- `items` — общий ресурс: в CPython `list.append()` обычно атомарен, но порядок результатов не гарантирован и переносимость/параллелизм могут потребовать синхронизации; лучше использовать `threading.Lock` или `queue.Queue`.
Ожидаемый результат при корректном запуске с `range(100)` — добавятся значения для чётных `x`, то есть всего 50 \ 50\ 50 элементов (0..99 даёт 100 \ 100\ 100 входных значений, половина — чётные).
Исправления — два варианта.
1) С блокировкой (минимально менять код)
```python
import threading
items = []
lock = threading.Lock()
def worker(x):
if x % 2 == 0:
with lock:
items.append(x*2)
threads = [threading.Thread(target=worker, args=(i,)) for i in range(100)]
for t in threads:
t.start()
for t in threads:
t.join()
print(len(items)) # ожидаемо 50
```
2) С использованием потокобезопасной очереди (`queue.Queue`)
```python
import threading
import queue
q = queue.Queue()
def worker(x):
if x % 2 == 0:
q.put(x*2)
threads = [threading.Thread(target=worker, args=(i,)) for i in range(100)]
for t in threads: t.start()
for t in threads: t.join()
items = []
while not q.empty():
items.append(q.get())
print(len(items)) # ожидаемо 50
```
Замечания
- Порядок элементов в `items` может отличаться от возрастающего, так как потоки выполняются конкурентно.
- Если нужна детерминированная последовательность, собирайте результаты по индексу (например, заранее массив нужной длины и записывайте в `results[i]`) с синхронизацией, либо собирайте и затем сортируйте. Например, можно хранить кортежи `(i, value)` и отсортировать по `i`.
- Проверка на чётность `x % 2 == 0` и передача аргумента `args=(i,)` в исходном коде корректны.
22 Дек 2025 в 06:59
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир