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 Anda | Praktik yang direkomendasikan | alasan |
|---|---|---|
| Hanya ingin menghentikan halaman atau antrian agar tidak macet | Berhenti menunggu dan tanyakan status tugas yang diketahui | Berhenti menunggu tidak berarti tugas jarak jauh telah berakhir |
| Khawatir tentang proses latar belakang yang menghabiskan memori | Konfirmasikan bahwa penghentian telah selesai dan isolasi dengan grup proses, kontainer, atau objek pekerjaan jika perlu | subprocess.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 jadi | Tandai produk sementara sebagai tidak dapat dikirim dan jangan bagikan statusnya dengan hasil resmi | Akibat terlambat datang setelah batas waktu tidak bisa langsung mengubah tugas menjadi sukses. |
| Batas waktu berulang untuk masukan yang sama | Pisahkan sampel dan periksa kompleksitasnya tanpa percobaan ulang tanpa batas | Coba 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
| Aksi | Menyelesaikan masalah | Area yang masih perlu perhatian |
|---|---|---|
| Berhenti menunggu | Penelepon tidak lagi terjebak | Pekerjaan jarak jauh atau back-office mungkin masih berlangsung |
| Hentikan penegakan hukum | Melepaskan sumber daya yang ditempati oleh proses | Permintaan penghentian tidak berarti Anda sudah menarik diri; konfirmasi diperlukan |
| Penandaan produk tidak dapat dikirim | Mencegah pengiriman produk setengah jadi secara tidak sengaja | Negara 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 ketahui | Tujuan | Catatan |
|---|---|---|
| Fase timeout | Membedakan antara mengunduh, mengurai, atau menerjemahkan | Bukan hanya satu timeout |
| Apakah penghentian dikonfirmasi | Mencegah pekerjaan backend tertinggal | Meminta pemutusan hubungan tidak berarti Anda telah menarik diri |
| Identitas produk sementara | Hindari pengiriman produk yang belum selesai secara keliru | Tidak berbagi status dengan hasil resmi |
| Hitungan ulang | Kendalikan anggaran keseluruhan | Anda 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


