MiddleКодЧастоЕщё не отвечали
Почему этот многопоточный CPU-цикл не ускоряется?
Здесь два потока чистого Python-счёта, но это не быстрее одного.
import threading
def count():
x = 0
for _ in range(10**7): x += 1
t1 = threading.Thread(target=count)
t2 = threading.Thread(target=count)
t1.start(); t2.start(); t1.join(); t2.join()
Определите, почему нет ускорения и как это исправить.
Два потока не быстрее последовательного запуска — часто медленнее, из-за борьбы за GIL — потому что count это чистая Python-нагрузка на CPU, а GIL пускает лишь один поток исполнять байткод одновременно. Чтобы распараллелить, используйте multiprocessing.Process или ProcessPoolExecutor.
- ✗Считать, что потоки дают CPU-параллелизм в CPython
- ✗Думать, что GIL влияет лишь на I/O, но не на CPU-циклы
- ✗Ожидать, что более длинный цикл преодолеет GIL
- →Почему GIL не вредит I/O-нагруженному многопоточному коду так же?
- →Как
multiprocessingдостигает реального CPU-параллелизма, недоступного потокам?