🐍 Python  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Сложный  · 

Потоки и процессы

Проверяет различие задач ввода-вывода и вычислений, GIL, обмен данными и синхронизацию. Тест построен вокруг реальных фрагментов и решений: от «Потоки» и «Процессы» до «Ограничение GIL» и «Синхронизация». Все задания рассчитаны на CPython 3.12; отличия других реализаций или версий учитываются только там, где это прямо оговорено.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Версия: CPython 3.12. Выберите один ответ из четырёх. На 20 вопросов отведено не меньше 40 минут; код лучше читать построчно. После завершения вы увидите общий процент, четыре тематические шкалы и объяснение каждого ответа.
Вопрос 1 из 20
Почему вызов `start()` принципиально отличается от прямого вызова `run()`?
Вопрос 2 из 20
Зачем при запуске процессов защищать точку входа условием `if __name__ == "__main__"`?
Вопрос 3 из 20
Нужно спроектировать конкурентную обработку множества независимых операций ввода-вывода в CPython 3.12. Какой исполнитель выбрать?
Вопрос 4 из 20
Как исправить гонку при увеличении общего счётчика?
Вопрос 5 из 20
Задачи переданы в пул одновременно, а результаты читаются через `as_completed`. В каком порядке будет сформирован список?
Python
import time
from concurrent.futures import ThreadPoolExecutor, as_completed

def load(name):
    delays = {"slow": 0.30, "fast": 0.05, "mid": 0.15}
    time.sleep(delays[name])
    return name

with ThreadPoolExecutor(max_workers=3) as ex:
    futures = [ex.submit(load, name) for name in ["slow", "fast", "mid"]]
    result = [future.result() for future in as_completed(futures)]
print(result)
Вопрос 6 из 20
Почему передача `lambda` в `ProcessPoolExecutor` обычно завершается ошибкой сериализации?
Вопрос 7 из 20
Почему наличие GIL не делает словарь или счётчик автоматически безопасным на уровне бизнес-операции?
Вопрос 8 из 20
Три рабочих потока читают задания из `queue.Queue`. Как завершить каждый поток через значение-сторож и при этом позволить `queue.join()` корректно дождаться обработки?
Вопрос 9 из 20
Почему поток-демон не подходит для обязательной записи критических данных перед выходом программы?
Вопрос 10 из 20
Как родитель получит вычисленный результат от отдельного процесса?
Вопрос 11 из 20
Что вероятнее для двух потоков, выполняющих чисто вычислительную функцию в обычной сборке CPython 3.12?
Вопрос 12 из 20
Сравните порядок захвата в `first()` и `second()`. Какая деталь создаёт возможность взаимной блокировки?
Python
from threading import Lock

lock_a = Lock()
lock_b = Lock()

def work():
    pass

def first():
    with lock_a:
        with lock_b:
            work()

def second():
    with lock_b:
        with lock_a:
            work()
Вопрос 13 из 20
Как обработать результаты именно по мере завершения?
Вопрос 14 из 20
Что напечатает родительский процесс?
Python
from multiprocessing import Process

value = []
def worker():
    value.append(1)

if __name__ == "__main__":
    p = Process(target=worker)
    p.start(); p.join()
    print(value)
Вопрос 15 из 20
Когда два потока всё же могут реально выполнять тяжёлую работу параллельно на разных ядрах?
Вопрос 16 из 20
Что ограничивает `Semaphore(3)` вокруг участка работы потока?
Вопрос 17 из 20
Что гарантирует выход из блока Executor?
Вопрос 18 из 20
Почему передача огромного объекта каждому заданию ProcessPool может свести на нет выигрыш?
Вопрос 19 из 20
Два потока читают общий счётчик до барьера, а затем записывают увеличенное значение. Что напечатает код и почему?
Python
from threading import Barrier, Thread

counter = 0
barrier = Barrier(2)

def add_once():
    global counter
    current = counter
    barrier.wait()
    counter = current + 1

threads = [Thread(target=add_once) for _ in range(2)]
for thread in threads:
    thread.start()
for thread in threads:
    thread.join()
print(counter)
Вопрос 20 из 20
Событие уже установлено до запуска второго ожидающего потока. Что произойдёт в этом граничном сценарии?

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу