Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah saya boleh menjalankan beberapa subproses secara selari dan mengumpul output mereka tanpa menggunakan multiprocessing atau threading dalam Python?
Menjalankan Subproses Selari dengan Koleksi Output
Dalam senario yang diberikan, berbilang kucing | arahan zgrep sedang dilaksanakan secara berurutan pada pelayan jauh. Untuk menjalankan arahan ini secara serentak semasa mengumpul output individu, kita perlu mengelak daripada menggunakan berbilang pemprosesan atau penjalinan.
Penyelesaian mudah ialah menggunakan fungsi Popen daripada modul subproses. Dengan mencipta objek Popen individu untuk setiap arahan dan memberikan hujah shell, kita boleh menjalankannya secara selari. Setelah arahan selesai, kami boleh mengumpul kod keluar mereka menggunakan kaedah tunggu. Berikut ialah contoh:
<code class="python">from subprocess import Popen # Create a list of commands commands = ['echo {i:d}; sleep 2; echo {i:d}' for i in range(5)] # Run commands in parallel processes = [Popen(command, shell=True) for command in commands] # Collect statuses exitcodes = [p.wait() for p in processes]</code>
Kod ini menjalankan lima arahan secara serentak dan mengumpul kod keluarnya sebaik sahaja ia selesai.
Untuk mengumpul output daripada arahan, kita boleh menggunakan benang atau kaedah berkomunikasi dalam proses yang berasingan. Contohnya, menggunakan kumpulan benang:
<code class="python">from multiprocessing.dummy import Pool # thread pool from subprocess import Popen # Run commands in parallel processes = [Popen(command, shell=True, close_fds=True) for command in commands] # Collect output in parallel def get_output(process): return process.communicate()[0] outputs = Pool(len(processes)).map(get_output, processes)</code>
Kod ini menjalankan semua perintah serentak dalam kumpulan benang dan mengumpulkan outputnya ke dalam senarai, di mana setiap elemen sepadan dengan output arahan individu.
Alternatif lain ialah menggunakan modul asyncio untuk pengumpulan output dalam urutan yang sama (Python 3.8 dan ke atas):
<code class="python">import asyncio from subprocess import PIPE async def get_output(command): process = await asyncio.create_subprocess_shell(command, stdout=PIPE) return (await process.communicate()[0]).decode() # Get commands output in parallel coros = [get_output(command) for command in commands] outputs = await asyncio.gather(*coros)</code>
Kod ini mencipta coroutine yang melaksanakan arahan secara serentak dan mengembalikan outputnya sebagai senarai.
Atas ialah kandungan terperinci Bagaimanakah saya boleh menjalankan beberapa subproses secara selari dan mengumpul output mereka tanpa menggunakan multiprocessing atau threading dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!