multiprocessing fork () vs spawn ()

Sep 28 2020

Saya membaca deskripsi keduanya dari doc python :

muncul

Proses induk memulai proses interpreter python baru. Proses anak hanya akan mewarisi sumber daya yang diperlukan untuk menjalankan metode run () objek proses. Secara khusus, deskriptor dan pegangan file yang tidak perlu dari proses induk tidak akan diwariskan. Memulai proses menggunakan metode ini agak lambat dibandingkan dengan menggunakan fork atau forkserver. [Tersedia di Unix dan Windows. Default di Windows dan macOS.]

garpu

Proses induk menggunakan os.fork () untuk membagi interpreter Python. Proses anak, ketika dimulai, secara efektif identik dengan proses induk. Semua sumber daya induk diwarisi oleh proses anak. Perhatikan bahwa melakukan forking pada proses multithread merupakan masalah. [Tersedia hanya di Unix. Default di Unix.]

Dan pertanyaan saya adalah:

  1. apakah garpu itu jauh lebih cepat karena tidak mencoba mengidentifikasi sumber daya mana yang akan disalin?
  2. apakah itu, karena fork menduplikasi semuanya, itu akan "membuang" lebih banyak sumber daya dibandingkan dengan spawn ()?

Jawaban

3 Darkonaut Sep 28 2020 at 12:25
  1. apakah garpu itu jauh lebih cepat karena tidak mencoba mengidentifikasi sumber daya mana yang akan disalin?

Ya, jauh lebih cepat. Kernel dapat mengkloning seluruh proses dan hanya menyalin halaman memori yang dimodifikasi secara keseluruhan . Mengirimkan resource ke proses baru dan mem-boot interpreter dari awal tidak diperlukan.

  1. apakah itu, karena fork menduplikasi semuanya, itu akan "membuang" lebih banyak sumber daya dibandingkan dengan spawn ()?

Fork pada kernel modern hanya melakukan "copy-on-write" dan hanya mempengaruhi halaman memori yang benar-benar berubah. Peringatannya adalah bahwa "tulis" sudah mencakup hanya iterasi atas objek di CPython. Itu karena jumlah referensi untuk objek bertambah.

Jika Anda memiliki proses yang berjalan lama dengan banyak objek kecil yang digunakan, ini berarti Anda membuang lebih banyak memori daripada dengan pemijahan. Anekdot saya ingat Facebook mengklaim telah mengurangi penggunaan memori secara signifikan dengan beralih dari "fork" ke "spawn" untuk proses Python mereka.