Debug multiprocessing dengan Python

Jawaban:

6

Program Python multiprosesor yang sebenarnya (tidak seperti program Python multi- utas yang harus berurusan dengan GIL yang ditakuti ) tidak berbeda dari yang ada dalam bahasa lain. Mereka semua memiliki tantangan dasar yang sama:

  1. Penugasan tugas dan pelaporan hasil. Bahkan jika mereka sebagian besar bekerja pada dataset independen, mereka biasanya harus kembali ke master thread untuk melaporkan hasil dan mendapatkan data baru untuk dikerjakan. Ini bisa menjadi titik tersedak.
  2. Kondisi balapan. Proses mencoba menggunakan sumber daya satu per satu dan mereka perlu menggunakan mutex (atau yang serupa) agar tidak menginjak semua data masing-masing. Kegagalan untuk melindungi sumber daya semacam ini dapat menyebabkan sesi debug yang benar- benar menyakitkan.
  3. Urutan. Terkadang Anda mencoba untuk membuat sesuatu yang paralel yang tidak. Berbagai proses akhirnya menunggu satu sama lain untuk melakukan sesuatu dan hasil akhirnya adalah bahwa Anda, untuk semua maksud dan tujuan, mengambil program berurutan, membuatnya paralel, dan masih berakhir dengan mengeksekusi dalam waktu linier (atau lebih buruk).

Meskipun ada metode pengembangan yang mencoba menghindari masing-masing masalah ini, pada akhirnya Anda benar-benar perlu memikirkan apa yang Anda lakukan. Saya merekomendasikan pengujian stres berat - jauh melampaui apa pun yang Anda pikir mungkin terjadi dalam kehidupan nyata - sehingga Anda memiliki peluang bagus untuk mencapai Windows of Opportunity dan meledak dalam pengembangan dibandingkan dengan di tengah-tengah demo besar atau selama produksi.

Kami dulu menggunakan file log waktu-mikron dan kemudian membuat aplikasi tampilan kode warna sehingga kami bisa mencoba memvisualisasikan apa yang terjadi antara proses N yang berjalan pada prosesor M. Kami juga mencoba (dan sebagian besar berhasil) dalam menciptakan sistem yang akan mengusir file log untuk menciptakan kembali konteks crash.

Tetapi alat terbaik adalah desain yang bagus dan orang-orang jahat yang benar-benar jahat, yang mencoba mengeluarkan aplikasi Anda dari air. (Hai, dbell!)

Peter Rowell
sumber
25

Satu hal yang menurut saya sangat membantu, adalah menggunakan logger yang ada di multiprocessingmodul. Coba ini di kode utama Anda:

import multiprocessing, logging
mpl = multiprocessing.log_to_stderr()
mpl.setLevel(logging.INFO)

Lihat juga: http://docs.python.org/library/multiprocessing.html#logging

Selain itu, Anda dapat mengakses nama proses saat ini menggunakan:

cpname = multiprocessing.current_process().name
# print cpname
mylogger.info("{0} is currently doing...".format(cpname))

Lihat: http://docs.python.org/library/multiprocessing.html#multiprocessing.current_process

Selain itu saya tidak tahu apa-apa selain metode debug standar seperti pdb& co.

exhuma
sumber