Bagaimana untuk Melaksanakan Subproses Tidak Menyekat dalam Python?

Susan Sarandon
Lepaskan: 2024-10-19 13:45:29
asal
484 orang telah melayarinya

How to Execute Non-Blocking Subprocesses in Python?

Invokasi Subproses Tidak Menyekat

Apabila melaksanakan skrip luaran menggunakan subprocess.call, mengekalkan aliran kerja tidak menyekat adalah penting untuk mengelak program utama terhenti. Artikel ini membentangkan penyelesaian yang komprehensif untuk mencapai objektif ini.

Pendekatan menggunakan subproses.Popen

Kaedah utama untuk melaksanakan subproses tanpa sekatan ialah menggunakan subproses.Popen dan bukannya subproses.panggilan. Alternatif ini tidak menyekat program utama, membenarkan ia meneruskan operasinya sementara subproses berjalan secara bebas. Berikut ialah contoh:

<code class="python">subprocess.Popen(["python", "slave.py"] + sys.argv[1:])</code>
Salin selepas log masuk

Contoh Komprehensif

Untuk demonstrasi lengkap panggilan subproses tidak menyekat, pertimbangkan kod berikut:

<code class="python">import subprocess
import time

p = subprocess.Popen(['sleep', '5'])

while p.poll() is None:
    print('Still sleeping')
    time.sleep(1)

print('Not sleeping any longer.  Exited with returncode %d' % p.returncode)</code>
Salin selepas log masuk

Kod ini melaksanakan arahan 'sleep' secara tidak segerak, menyemak statusnya secara berkala sehingga ia selesai.

Pendekatan Asynchronous Alternatif

Untuk Python versi 3.5 dan ke atas, pendekatan yang lebih moden dan cekap melibatkan penggunaan asyncio. Ia membolehkan konkurensi yang benar, membolehkan pelbagai tugasan dilaksanakan secara serentak. Berikut ialah contoh:

<code class="python">import asyncio

async def do_subprocess():
    print('Subprocess sleeping')
    proc = await asyncio.create_subprocess_exec('sleep', '5')
    returncode = await proc.wait()
    print('Subprocess done sleeping.  Return code = %d' % returncode)

async def sleep_report(number):
    for i in range(number + 1):
        print('Slept for %d seconds' % i)
        await asyncio.sleep(1)

loop = asyncio.get_event_loop()

tasks = [
    asyncio.ensure_future(do_subprocess()),
    asyncio.ensure_future(sleep_report(5)),
]

loop.run_until_complete(asyncio.gather(*tasks))
loop.close()</code>
Salin selepas log masuk

Pendekatan ini memastikan kedua-dua subproses dan program utama berjalan serentak, memaksimumkan prestasi dan responsif.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Subproses Tidak Menyekat dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!