Subproses Bash Selari dengan Python: Panduan Komprehensif
Menggunakan modul penjalinan dan subproses Python dengan berkesan boleh membantu anda melaksanakan berbilang proses bash secara serentak. Walau bagaimanapun, hanya mencipta benang dengan benang mungkin tidak mencapai keselarian yang diingini.
Pengurusan Proses Serentak Tanpa Benang
Pendekatan mudah untuk menjalankan proses bash secara serentak ialah mengelak daripada menggunakan benang sama sekali. Menggunakan utiliti subprocess.Popen, anda boleh terus menggunakan berbilang arahan secara selari, seperti yang ditunjukkan di bawah:
<code class="python">from subprocess import Popen commands = [ 'date; ls -l; sleep 1; date', 'date; sleep 5; date', 'date; df -h; sleep 3; date', 'date; hostname; sleep 2; date', 'date; uname -a; date', ] # Execute commands concurrently processes = [Popen(cmd, shell=True) for cmd in commands]</code>
Mengawal Konkurensi dengan Multiprocessing
Jika anda perlu mengehadkan bilangan proses serentak, anda boleh menggunakan multiprocessing.dummy.Pool, yang menyediakan antara muka berasaskan benang yang serupa dengan multiprocessing.Pool. Kod berikut menggambarkan pendekatan ini:
<code class="python">from functools import partial from multiprocessing.dummy import Pool from subprocess import call pool = Pool(2) # Limit to 2 concurrent processes for i, returncode in enumerate(pool.imap(partial(call, shell=True), commands)): if returncode != 0: print("%d command failed: %d" % (i, returncode))</code>
Pengurusan Proses Kanak-kanak Tidak Menyekat
Sebagai alternatif, anda boleh mengehadkan proses anak serentak tanpa menggunakan kumpulan benang atau proses. Kod di bawah menunjukkan strategi ini:
<code class="python">from subprocess import Popen from itertools import islice max_workers = 2 # Maximum number of concurrent processes processes = (Popen(cmd, shell=True) for cmd in commands) running_processes = list(islice(processes, max_workers)) # Start initial processes while running_processes: for i, process in enumerate(running_processes): if process.poll() is not None: # Process has completed running_processes[i] = next(processes, None) # Start new process if running_processes[i] is None: # No new processes del running_processes[i] break</code>
Untuk sistem Unix, pertimbangkan untuk menggunakan os.waitpid(-1, 0) untuk mengelakkan gelung sibuk dan tunggu sebarang proses kanak-kanak ditamatkan.
Atas ialah kandungan terperinci Bagaimana untuk mengurus dan mengawal kesesuaian subproses bash selari dengan berkesan dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!