Waktu pemrosesan dokumen habis, jangan biarkan satu tugas menyeret seluruh kumpulan

PDF yang dipindai macet, dan sembilan puluh sembilan tugas berikutnya tidak dapat dipindahkan. Menambahkan waktu tunggu ke permintaan tampaknya menyelesaikan masalah, namun proses pemrosesan sebenarnya mungkin masih memakan memori di latar belakang. Batas waktu melibatkan setidaknya tiga tindakan: berhenti menunggu, menghentikan eksekusi, dan menandai produk sebagai tidak dapat dikirim.

Saat memproses dokumen dalam batch, hal yang paling merepotkan sering kali bukanlah kesalahan pada satu file, tetapi satu tugas terhenti, dan semua tugas berikutnya terhenti dalam antrian. Misalnya, jika PDF yang dipindai macet, sembilan puluh sembilan tugas berikutnya tidak akan dipindahkan. Menambahkan batas waktu ke permintaan tampaknya menyelesaikan masalah ini.

Namun batas waktu tidak berarti tugas telah berakhir. Proses mungkin masih berjalan di latar belakang dan terus menggunakan memori, atau produk mungkin hanya setengah jadi. Batas waktu mencakup setidaknya tiga tindakan: berhenti menunggu, menghentikan eksekusi, dan menandai produk sebagai tidak dapat dikirim. Setelah membaca artikel ini, Anda akan dapat menentukan bukti apa yang perlu dicatat setelah batas waktu, dalam keadaan apa yang tepat untuk mencoba kembali, dan bagaimana memisahkan waktu tunggu klien dari status tugas jarak jauh.

Artikel ini menggunakan sampel sintetis untuk mendemonstrasikan metode pemrosesan. Kode telah diperiksa dengan contoh di lingkungan yang terisolasi dan bukan merupakan jaminan atas semua file nyata atau kinerja produk. Sebelum memproses dokumen penting, harap simpan dokumen asli dan tinjau sesuai dengan batasan dan item penerimaan dalam teks.

Satu kalimat kesimpulan

Batas waktu tugas batch harus dipecah menjadi tiga hal: berhenti menunggu, menghentikan eksekusi, dan menandai produk sebagai tidak dapat dikirim. "Waktu tunggu habis" tidak dapat langsung dianggap sebagai "tugas dihentikan".

situasi AndaPraktik yang direkomendasikanalasan
Hanya ingin menghentikan halaman atau antrian agar tidak macetBerhenti menunggu dan tanyakan status tugas yang diketahuiBerhenti menunggu tidak berarti tugas jarak jauh telah berakhir
Khawatir tentang proses latar belakang yang menghabiskan memoriKonfirmasikan bahwa penghentian telah selesai dan isolasi dengan grup proses, kontainer, atau objek pekerjaan jika perlusubprocess.run(timeout=...) valid untuk proses anak langsung dan tidak dapat digeneralisasikan dengan fakta bahwa seluruh pohon proses telah dibersihkan
Produk tersebut mungkin merupakan produk setengah jadiTandai produk sementara sebagai tidak dapat dikirim dan jangan bagikan statusnya dengan hasil resmiAkibat terlambat datang setelah batas waktu tidak bisa langsung mengubah tugas menjadi sukses.
Batas waktu berulang untuk masukan yang samaPisahkan sampel dan periksa kompleksitasnya tanpa percobaan ulang tanpa batasCoba lagi hanya masuk akal jika kegagalan dapat dipulihkan dan panggilan tersebut idempoten.

Menunggu waktu habis bukan berarti pekerjaan dihentikan

Batas waktu hanya mempengaruhi penelepon

subprocess.run(timeout=...) dapat menghentikan proses anak langsung, namun tidak menjamin bahwa pohon proses apa pun telah dibersihkan. Sistem operasi yang berbeda, metode startup, dan perilaku proses cucu akan mempengaruhi hasilnya. Untuk perilaku terkait, silakan merujuk ke Perilaku timeout subproses Python.

Lingkungan produksi memerlukan strategi isolasi

Implementasi produksi biasanya memerlukan sarana isolasi seperti grup proses, kontainer, atau objek pekerjaan untuk memastikan bahwa pekerjaan terkait benar-benar berhenti setelah waktu habis.

Tulis dulu kontrak status tugas dengan jelas

Berikut ini hanya menyimulasikan penentuan status, tidak memulai perintah eksternal, dan tidak dengan sengaja menghentikan proses. Inti dari demonstrasinya adalah: setelah tenggat waktu tercapai, meskipun suatu unit kerja datang terlambat dengan hasil, tugas yang telah habis waktunya tidak dapat langsung diubah menjadi sukses.

from dataclasses import dataclass

@dataclass(frozen=True)
class Decision:
    state: str
    deliver: bool
    terminate_requested: bool

def decide(now, deadline, worker_done, artifact_valid):
    if now >= deadline:
        return Decision("timed_out", False, not worker_done)
    if not worker_done:
        return Decision("processing", False, False)
    if not artifact_valid:
        return Decision("invalid_artifact", False, False)
    return Decision("verified", True, False)

assert decide(9, 10, False, False).state == "processing"
assert decide(10, 10, False, False).terminate_requested
assert not decide(11, 10, True, True).deliver
assert decide(9, 10, True, True).deliver
assert decide(9, 10, True, False).state == "invalid_artifact"

Protokol ini memilih batas waktu yang sama dengan tenggat waktu. Anda juga dapat menggunakan batasan lain, namun batasan tersebut harus dituliskan ke dalam pengujian. Perbandingan waktu nyata harus menggunakan jam monoton yang sesuai dengan interval perhitungan dan tidak memungkinkan penyesuaian zona waktu sistem atau jam dinding mengubah anggaran tugas.

📊 Perbandingan inti

AksiMenyelesaikan masalahArea yang masih perlu perhatian
Berhenti menungguPenelepon tidak lagi terjebakPekerjaan jarak jauh atau back-office mungkin masih berlangsung
Hentikan penegakan hukumMelepaskan sumber daya yang ditempati oleh prosesPermintaan penghentian tidak berarti Anda sudah menarik diri; konfirmasi diperlukan
Penandaan produk tidak dapat dikirimMencegah pengiriman produk setengah jadi secara tidak sengajaNegara bagian harus dipisahkan dari hasil resmi

Bukti apa yang tersisa setelah waktu habis?

Setelah timeout terjadi, Anda tidak dapat hanya mencatat satu timeout di log. Informasi berikut dapat membantu Anda mengidentifikasi di mana letak masalahnya:

Hal-hal yang perlu Anda ketahuiTujuanCatatan
Fase timeoutMembedakan antara mengunduh, mengurai, atau menerjemahkanBukan hanya satu timeout
Apakah penghentian dikonfirmasiMencegah pekerjaan backend tertinggalMeminta pemutusan hubungan tidak berarti Anda telah menarik diri
Identitas produk sementaraHindari pengiriman produk yang belum selesai secara keliruTidak berbagi status dengan hasil resmi
Hitungan ulangKendalikan anggaran keseluruhanAnda tidak bisa mendapatkan waktu tak terbatas setiap kali

Mencoba ulang bukanlah langkah otomatis berikutnya

Ketika sumber daya berulang kali habis pada langkah yang sama, periksa dulu

Jika input yang sama menghabiskan sumber daya pada langkah yang sama setiap kali, isolasi sampel dan periksa masalah kompleksitas daripada mencoba ulang.

Membedakan antara dua jenis tips

Pengguna harus dapat membedakan antara dua skenario:

  • Layanan sibuk, mencoba ulang: Anda bisa menunggu.
  • Input tidak didukung, perlu ditangani: Memerlukan intervensi manual atau penggantian input.

🎯 Metode mana yang cocok untukmu?

Jika Anda menangani volume dokumen yang besar

Setiap tugas diatur waktu batas yang independen; ketika satu tugas melewati, hanya tugas yang menandai dirinya sendiri, sehingga seluruh batch tidak bisa berhenti.

Jika Anda khawatir tentang kebocoran sumber daya

Setelah timeout, pastikan apakah terminasi benar-benar selesai, dan isolasi di tingkat kontainer atau grup proses, daripada hanya mengandalkan timeout dari proses anak langsung.

Jika Anda ingin terhubung dengan platform terjemahan online

Waktu tunggu klien, status pemrosesan platform, dan status unduhan file harus diwakili secara terpisah. Sebelum mengklik lagi, periksa tugas yang sudah dikenal untuk menghindari konsumsi duplikat.

❓ Pertanyaan yang Sering Diajukan (FAQ)

1. Jika permintaan sudah habis waktu, mengapa eksekusi dihentikan?

Setelah timeout, pemrosesan mungkin masih berjalan di latar belakang dan menghabiskan memori; menghentikan penantian tidak otomatis melepaskan sumber daya ini.

2. Apakah misi dijamin gagal setelah timeout?

Tidak selalu. Namun, jika tugas tertunda setelah timeout, tugas tersebut tidak dapat langsung diubah menjadi tugas yang berhasil; tugas tersebut harus ditentukan sesuai dengan kontrak status.

3. Kapan waktu yang tepat untuk mencoba ulang?

Coba ulang hanya masuk akal jika penyebab kegagalan dapat dipulihkan dan panggilan memiliki idempotensi yang sesuai. Jika input yang sama menghabiskan sumber daya pada langkah yang sama setiap kali, isolasi dan pemecahan masalah harus dilakukan terlebih dahulu.

4. Bukti apa yang harus dicatat setelah waktu berakhir?

Setidaknya, catat fase timeout, apakah penghentian telah dikonfirmasi, identitas produk sementara, dan jumlah percobaan ulang yang diperlukan.

📝 Ringkasan

Kunci timeout adalah memisahkan "berhenti menunggu," "menghentikan eksekusi," dan "apakah produk dapat dikirim." Setelah status tugas jelas, batch tidak akan terseret turun oleh satu file pun.

Rasakan sekarang: Unggah dokumen Anda untuk mulai menerjemahkan, mempertahankan format asli

Diperbarui 2026-11-15