Do start method khác nhau giữa các nền tảng. multiprocessing có ba cách tạo process con:
- fork — nhân bản process cha, nhanh, thừa hưởng toàn bộ bộ nhớ và file descriptor. Nhưng fork một process đang có nhiều thread là không an toàn: lock đang bị giữ ở thread khác sẽ bị copy ở trạng thái khoá → process con treo. Connection pool DB, logging handler, event loop bị kế thừa cũng gây lỗi khó lần.
- spawn — khởi động interpreter mới, import lại module
__main__, chỉ nhận tham số qua pickle. An toàn nhất, chậm nhất. - forkserver — một server process sạch được fork ra từ sớm, mỗi lần cần thì fork từ đó; tránh được rủi ro thread của cha.
Mặc định: Windows và macOS dùng spawn; Linux trước đây dùng fork, và từ Python 3.14 mặc định trên POSIX đổi sang forkserver (fork không còn là mặc định trên nền tảng nào).
Vì spawn/forkserver import lại module chính, thiếu guard sẽ khiến code top-level chạy lại trong mỗi process con và sinh process vô hạn:
python
import multiprocessing as mp
def work(n): return n * n
if __name__ == "__main__": # required for spawn/forkserver
with mp.Pool(4) as pool:
print(pool.map(work, range(10)))Thói quen an toàn: luôn có guard __main__; chọn start method tường minh bằng mp.set_start_method("spawn") hoặc mp.get_context("spawn") để mọi nền tảng chạy giống nhau; đảm bảo tham số và giá trị trả về picklable; tạo lại connection/pool trong process con thay vì kế thừa.