Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mengurus dan mengawal kesesuaian subproses bash selari dengan berkesan dalam Python?

Bagaimana untuk mengurus dan mengawal kesesuaian subproses bash selari dengan berkesan dalam Python?

DDD
DDDasal
2024-10-30 04:37:02381semak imbas

How to effectively manage and control the concurrency of parallel bash subprocesses in Python?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn