Час очікування обробки документів, не дозволяйте одному завданню затягувати весь пакет

Відсканований PDF-файл застряг, і наступні дев’яносто дев’ять завдань не перемістяться. Додавання тайм-ауту до запиту, здається, вирішує проблему, але фактичний процес обробки може все ще споживати пам’ять у фоновому режимі. Тайм-аути передбачають принаймні три дії: припинення очікування, припинення виконання та позначення продукту як неможливого для доставки.

При пакетній обробці документів найбільше неприємностей часто викликає не помилка окремого файлу, а те, що одне завдання застрягло, а всі наступні завдання зупиняються в черзі. Наприклад, якщо сканований PDF-файл застряг, наступні дев’яносто дев’ять завдань не перемістяться. Здається, цю проблему вирішує додавання тайм-ауту до запиту.

Але тайм-аут не означає, що завдання завершено. Процеси можуть усе ще працювати у фоновому режимі та продовжувати займати пам’ять, або продукт може бути лише наполовину готовим. Час очікування включає принаймні три дії: припинення очікування, припинення виконання та позначення продукту як неможливого для доставки. Прочитавши цю статтю, ви зможете визначити, які докази потрібно записати після тайм-ауту, за яких обставин доречно повторити спробу та як відокремити час очікування клієнта від стану віддаленого завдання.

У цій статті використовуються синтетичні зразки для демонстрації методу обробки. Код було перевірено з прикладами в ізольованому середовищі, і це не є гарантією всіх реальних файлів або продуктивності продукту. Перед обробкою важливих документів збережіть оригінали та перегляньте їх відповідно до меж і пунктів прийняття в тексті.

Висновок одним реченням

Час очікування пакетного завдання має бути розбитий на три речі: припинення очікування, припинення виконання та позначення продукту як неможливого для доставки. «Тайм-аут очікування» не можна безпосередньо розглядати як «завдання завершено».

ваша ситуаціяРекомендовані практикипричина
Просто хочу, щоб сторінка чи черга не зависалиПрипиніть очікування та запитайте відомий статус завданняПрипинення очікування не означає, що віддалене завдання завершено
Турбуйтеся про те, що фонові процеси займають пам’ятьПідтвердьте завершення завершення та ізолюйте його групою процесів, контейнером або об’єктом завдання, якщо необхідноsubprocess.run(timeout=...) дійсний для прямих дочірніх процесів і не може бути узагальнений до факту, що все дерево процесів було очищено
Продукт може бути напівфабрикатомПозначте тимчасовий продукт як такий, що неможливо доставити, і не повідомляйте статус про офіційний результатРезультат запізнення після тайм-ауту не може безпосередньо змінити завдання на успішне.
Повторні тайм-аути для того самого введенняВиділяйте зразки та перевіряйте складність без необмежених повторівПовторна спроба має сенс, лише якщо помилку можна відновити і виклик належним чином ідемпотентний.

Очікування тайм-ауту не означає, що роботу було припинено

Час очікування впливає лише на абонента

subprocess.run(timeout=...) може тайм-аут направляти дочірні процеси, але це не гарантує, що будь-яке дерево процесів було очищено. Різні операційні системи, методи запуску та поведінка процесу-онука впливатимуть на результати. Для відповідної поведінки зверніться до Поведінка тайм-ауту підпроцесів Python.

Виробниче середовище вимагає стратегії ізоляції

Виробничі реалізації зазвичай вимагають засобів ізоляції, таких як групи процесів, контейнери або об’єкти завдань, щоб забезпечити фактичну зупинку пов’язаної роботи після тайм-ауту.

Спочатку чітко напишіть контракт про статус завдання

Далі лише імітується визначення стану, не запускаються зовнішні команди та навмисно не призупиняється процес. Ключовий момент його демонстрації полягає в тому, що після закінчення кінцевого терміну, навіть якщо робоча одиниця приходить із запізненням із результатом, завдання з вичерпаним часом не може бути безпосередньо змінено на успішне.

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"

Цей протокол вибирає тайм-аут, що дорівнює кінцевому терміну. Ви також можете використовувати іншу границю, але вона повинна бути записана в тесті. Порівняння в режимі реального часу має використовувати монотонний годинник, який відповідає інтервалу розрахунку, і не допускати зміни системного часового поясу або настінного годинника на бюджет завдання.

📊 Основне порівняння

діюПроблема вирішенаРечі, які ще потребують уваги
перестань чекатиАбонент більше не застрягВіддалена або фонова робота може ще тривати
Зупинити виконанняРесурси, зайняті процесамиЗапит на припинення не означає, що ви вже відкликали; потрібне підтвердження
Маркування продукції не підлягає доставціЗапобігає помилковій доставці напіввиробництваШтат має бути відокремлений від офіційних результатів

Які докази залишаються після закінчення терміну?

Після тайм-ауту ви не можете записати лише один тайм-аут у журнал. Наступна інформація допоможе вам визначити, де саме полягає проблема:

Речі, які потрібно знатиМетаПримітка
Фаза тайм-аутуРозрізняйте завантаження, парсинг або перекладНе лише один тайм-аут
Чи підтверджено припиненняНе дозволяйте бекенд-роботі залишатися позадуЗапит на припинення не означає, що ви відкликали контракт
Тимчасова ідентичність добуткуУникайте помилкової доставки незавершеної продукціїСтатус не поділяється з офіційними результатами
Повторний підрахунок спробКонтролюйте загальний бюджетТи не можеш щоразу відновити необмежений час

Повторна спроба — це не автоматичний наступний крок

Коли ресурси вичерпуються на одному й тому ж етапі, перевірте спочатку

Якщо один і той самий вхід витрачає ресурси на одному й тому ж етапі щоразу, ізолюйте зразок і перевірте на складність замість повторних спроб.

Розрізнення двох типів підказок

Користувачі повинні вміти розрізняти два сценарії:

  • Сервіс зайнятий, пробує знову: Можеш почекати.
  • Вхід не підтримується, потрібно обробляти: Потрібне ручне втручання або заміна вхідних даних.

🎯 Який метод тобі підходить?

Якщо ви працюєте з великими обсягами документів

Кожне завдання встановлюється незалежний час порізу; коли одне завдання перевищується, лише воно позначає себе, не даючи всій партії зупинитися.

Якщо ви хвилюєтеся через витоки ресурсів

Після тайм-ауту переконайтеся, чи завершення справді завершене, і ізолюйте на рівні контейнера або групи процесів, а не покладайтеся лише на тайм-аути від прямих дочірніх процесів.

Якщо ви хочете зв'язатися з онлайн-платформами перекладу

Час очікування клієнта, статус обробки платформи та статус завантаження файлів слід вказувати окремо. Перед наступним натисканням перевірте відомі завдання, щоб уникнути дублювання споживання.

❓ Поширені запитання (FAQ)

1. Якщо запит закінчується, навіщо зупинятися виконанням?

Після тайм-ауту обробка може все ще працювати у фоновому режимі та займати пам'ять; зупинка очікування не автоматично звільняє ці ресурси.

2. Чи гарантовано місія провалиться після тайм-ауту?

Не обов'язково. Однак, якщо завдання затримується після тайм-ауту, його не можна безпосередньо змінити на успішне; воно має бути визначене відповідно до статусного контракту.

3. Коли доречно спробувати знову?

Повторна спроба має сенс лише тоді, коли причину відмови можна відновити і дзвінок має відповідну ідемпотентність. Якщо один і той самий вхід витрачає ресурси на одному й тому ж етапі кожного разу, спочатку слід провести ізоляцію та усунення несправностей.

4. Які докази слід записати після закінчення терміну?

Щонайменше зафіксуйте фазу тайм-ауту, чи підтверджено завершення, тимчасову ідентифікацію продукту та кількість необхідних повторних спроб.

📝 Резюме

Ключ до тайм-аутів — розділити «припинити очікування», «зупинити виконання» та «чи можна продукт доставити». Після того, як статус завдання стає зрозумілим, пакети не будуть опускатися одним файлом.

Досвід зараз: завантажте документ, щоб почати переклад, зберігаючи оригінальне форматування

Оновлено 2026-11-15