41 lines
1.6 KiB
Python
41 lines
1.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Демо: spawn — каждый процесс заново импортирует модуль.
|
|
|
|
Запуск из корня курса:
|
|
python lab04_multiprocessing/examples/01_spawn_demo.py
|
|
|
|
Показывает, что на Windows/spawn дочерний процесс заново выполняет
|
|
модуль верхнего уровня. Поэтому защита __main__ обязательна.
|
|
Здесь же видно время старта процесса.
|
|
"""
|
|
import multiprocessing
|
|
import os
|
|
import sys
|
|
import time
|
|
|
|
print(f"[импорт модуля] pid={os.getpid()}, parent={os.getppid()}, "
|
|
f"метод={multiprocessing.get_start_method()}")
|
|
|
|
|
|
def worker(x):
|
|
return x * x
|
|
|
|
|
|
def main():
|
|
print(f"\n[главный процесс] pid={os.getpid()}")
|
|
ctx = multiprocessing.get_context() # spawn на Windows и macOS
|
|
|
|
t0 = time.perf_counter()
|
|
with ctx.Pool(2) as pool:
|
|
results = pool.map(worker, range(8))
|
|
dt = time.perf_counter() - t0
|
|
|
|
print(f"pool.map -> {results}")
|
|
print(f"время (включая старт 2 процессов): {dt * 1000:.1f} мс")
|
|
print("\nОбратите внимание: строка [импорт модуля] могла напечататься")
|
|
print("дважды-трижды (для каждого воркера при spawn). На fork — один раз.")
|
|
print("Вывод: старт воркеров не бесплатный — это накладные расходы лабы 4.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |