Gesaan dan skop
Python 3.14 menambah InterpreterPoolExecutor; setiap penterjemah pekerja (worker interpreter) mempunyai GIL tersendiri dan boleh melaksanakan kod Python secara selari, manakala panggilan dan hasil merentasi sempadan pengasingan dan penyirilan. Soalan ini menguji pertukaran (trade-off) keselarasan dan tergolong dalam coding. Ini bukan janji bahawa setiap beban kerja akan mengatasi proses atau sambungan natif.
Perkara yang dinilai oleh penemu duga
Jawapan yang kukuh menerangkan pengasingan penterjemah, keboleh-pickle-an (picklability), keadaan modul dan global, tingkah laku pemula (initializer), pembatalan, dan kos memori. Mereka membezakan Python terikat CPU daripada kerja terikat I/O dan membandingkan kolam bebenang, penterjemah, dan proses menggunakan beban kerja yang sama. Mereka juga merancang pembendungan kegagalan dan penutupan berkanun (deterministic shutdown).
Soalan untuk dijelaskan terlebih dahulu
- Adakah beban kerja itu kod bait Python, kod natif yang melepaskan GIL, atau I/O?
- Adakah argumen dan hasil boleh disirirkan dengan kos rendah, dan adakah objek bersaiz besar atau dikongsi?
- Adakah tugas bergantung pada cache global-proses, soket terbuka, atau keadaan modul boleh ubah (mutable)?
- Apakah belanjawan kependaman, pemprosesan (throughput), memori, dan masa mula?
- Bagaimanakah kegagalan pemula atau pekerja mempengaruhi kerja dalam barisan gilir?
- Adakah persekitaran pelaksanaan serasi dengan Python 3.14 dan semantik kolamnya?
Rangka jawapan 30 saat
"Saya akan menanda aras tiga kawalan: bebenang, InterpreterPoolExecutor, dan proses. Penterjemah boleh menjalankan kod bait Python pada pelbagai teras, tetapi setiap pekerja diasingkan dan panggilan boleh laksana (callables), argumen, serta hasil yang diserahkan memerlukan penyirilan. Saya akan mengekalkan tugas cukup kasar untuk melunaskan kos tersebut, mencipta sumber dalam pemula, mengelakkan global boleh ubah yang dikongsi, dan menentukan tingkah laku pembatalan serta mula semula. Keputusan ini memerlukan bukti pemprosesan, kependaman p95, CPU, memori, masa penyirilan, dan kadar kegagalan."
Jawapan langkah demi langkah
Langkah 1: Kelaskan beban kerja
Ukur masa CPU, perebutan GIL, masa sambungan natif, I/O menyekat, dan tempoh tugas. Bebenang mungkin mencukupi untuk I/O atau pustaka yang melepaskan GIL. Penterjemah menyasarkan keselarian CPU peringkat Python; proses kekal sebagai kawalan pengasingan dan keserasian yang berguna.
Langkah 2: Reka bentuk sempadan penyirilan
Serahkan panggilan boleh laksana peringkat atas yang boleh diimport dan nilai data yang padat. Elakkan penutupan (closures), deskriptor fail terbuka, kunci (locks), dan graf objek yang besar. Jika penyirilan mendominasi, kelompokkan rekod atau alihkan data tak boleh ubah (immutable) ke stor luaran yang dikongsi berbanding menyalinnya berulang kali.
Langkah 3: Mulakan sumber bagi setiap penterjemah
Gunakan pemula untuk mengimport modul, mengkonfigurasi keadaan berkanun, dan mencipta klien tempatan bagi penterjemah tersebut. Jangan menganggap bahawa singleton peringkat modul dikongsi merentas pekerja. Catatkan identiti kolam dan penterjemah dalam diagnostik tanpa membocorkan data pengguna.
Langkah 4: Tentukan kegagalan dan pembatalan
Anggap kegagalan pemula sebagai peristiwa peringkat kolam dan jelaskan tingkah laku tugas dalam barisan gilir. Hadkan janji masa hadapan (futures) yang belum selesai, sebarkan pengecualian dengan ID tugas, dan batalkan kerja pada sempadan kelompok. Permulaan semula pekerja mesti mencipta semula sumber tempatan-penterjemahnya dan tidak boleh menduplikasi kesan sampingan bukan idempoten.
Langkah 5: Tanda aras dan laksanakan pelancaran
Bandingkan saiz tugas dan keselarasan yang sama merentasi kolam bebenang, penterjemah, dan proses. Catatkan masa permulaan, penyirilan, pengiraan, dan penggabungan hasil, serta RSS, pemprosesan, p95, pengecualian, dan tempoh penutupan. Lakukan pelancaran kenari (canary rollout) untuk satu beban kerja, kekalkan sandaran kolam proses, dan hentikan jika kos pengasingan atau memori menghapuskan faedah CPU.
Jawapan model
"InterpreterPoolExecutor ialah calon untuk kod Python intensif CPU yang tidak boleh bergantung pada pustaka natif pelepasan GIL. Saya akan membuktikan beban kerja terlebih dahulu, kemudian membandingkan bebenang, penterjemah, dan proses di bawah input yang serupa. Tugas mesti merentasi sempadan penyirilan, jadi saya akan menggunakan panggilan boleh laksana yang boleh diimport, kelompok padat, permulaan tempatan-penterjemah, dan tiada global boleh ubah yang dikongsi. Saya akan menentukan kegagalan pemula, pembatalan, keidempoteman, dan penutupan, kemudian mengawal pelancaran berdasarkan bukti pemprosesan, p95, RSS, overhed penyirilan, dan kegagalan dengan sandaran proses."
Kesilapan lazim
- Menganggap penterjemah berkongsi pemboleh ubah global → keadaan adalah terasing dan pemulaan berulang → cipta sumber bagi setiap penterjemah.
- Menyerahkan tugas yang terlalu kecil → penyirilan dan penjadualan mendominasi → kelompokkan kerja dan ukur overhed.
- Mewariskan objek yang tidak boleh di-pickle → penyerahan gagal semasa masa jalanan → gunakan panggilan boleh laksana yang boleh diimport dan nilai mudah.
- Menggunakan penterjemah untuk I/O → kerumitan tidak menambah faedah CPU → bandingkan bebenang terlebih dahulu.
- Mengabaikan kesan sampingan semasa percubaan semula → permulaan semula menduplikasi penulisan → jadikan tugas idempoten atau gunakan komit luaran.
- Hanya mengukur pemprosesan → regresi memori dan kependaman ekor tersembunyi → jejaki RSS, p95, dan penutupan.
Soalan susulan
Soalan susulan 1: Bagaimanakah penterjemah mencapai keselarian?
Setiap pekerja mempunyai penterjemah dan GIL tersendiri, jadi kod bait Python boleh dilaksanakan pada berbilang teras. Pekerja tidak berkongsi keadaan penterjemah biasa.
Soalan susulan 2: Bilakah proses lebih diutamakan?
Gunakan proses apabila pengasingan ruang alamat yang lebih kukuh, pustaka serasi proses sedia ada, atau semantik penggunaan yang lebih mudah adalah lebih penting daripada kos permulaan proses dan memori.
Soalan susulan 3: Apakah yang berlaku kepada keadaan modul?
Import dan modul global boleh ubah adalah tempatan bagi penterjemah. Mulakan keadaan yang diperlukan dalam setiap pekerja dan jangan sekali-kali bergantung pada singleton yang dicipta dalam penterjemah penyerah.
Soalan susulan 4: Bagaimanakah anda memilih granulariti tugas?
Tingkatkan saiz kelompok sehingga penyirilan dan penjadualan menjadi sebahagian kecil daripada masa jalanan, kemudian sahkan bahawa kelompok masih memenuhi keperluan kependaman, pembatalan, dan percubaan semula.