Недетерминированное поведение в библиотеке PDF при доступе к модели Django между ними.Python

Программы на Python
Anonymous
Недетерминированное поведение в библиотеке PDF при доступе к модели Django между ними.

Сообщение Anonymous »

Приложение Django 4.2 на Python 3.10 иногда работает неправильно в месте, которое должно быть без сохранения состояния. Если я получу доступ к базе данных (

Код: Выделить всё

postgresql 14
через pcygopg 3.1.18) при работе с pypdf 3.17.4 выходной документ испорчен.. примерно в 1 из 8 попыток. Как определить причину нестабильного поведения?
В полученном PDF-файле отсутствует содержимое, поэтому сравнения выходного размера достаточно, чтобы определить, что возникла ошибка:

Код: Выделить всё

# call as: python3 manage.py minrepro input.pdf
import argparse, io
from django.core.management.base import BaseCommand
from pypdf import PdfReader, PdfWriter
from djangoapp.models import DjangoModel

def main(fin):
pdfout = PdfWriter()
pageout = pdfout.add_blank_page(width=200, height=200)

for i in range(8):
# Note: accessing the database *during* PDF merging is relevant!
# without the next line, the problem cannot be reproduced
for c in range(31): a = DjangoModel.objects.first()

fin.seek(0)
for pagein in PdfReader(fin, strict=True).pages:
pageout.merge_page(pagein)

with io.BytesIO() as fout:
pdfout.write(fout)
return fout.tell()

class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument(dest="pdf", type=argparse.FileType("rb") )
def handle(self, *args, **options):
for i in range(30):
if i == 0: first_size = main(options["pdf"])
current_size = main(options["pdf"])
if not first_size == current_size:
print(f"presumed stateless call was not {i=}, {first_size=} != {current_size=}")

  • Моя первая теория заключалась в том, что pyPDF не может генерировать действительно уникальные имена для повторяющихся идентификаторов (после слияния), а доступ к БД просто дает возможность (задержку) для чтобы стать заметным. Я искал импорт в любое время или случайный в соответствующих библиотеках, явных ошибок там не было. Кроме того, ничто вроде time.sleep(0.02) не могло заставить мой воспроизводитель работать, только доступ к базе данных.
  • Это CPython с упорядоченными по вставке словарями, большая часть кода должна вести себя то же самое на одинаковом входе. Также называется python с -W модулем::ResourceWarning -W модулем::DeprecationWarning -W модулем::PendingDeprecationWarning, чтобы с большей вероятностью получать уведомления о любых ошибках с моей стороны, ничего.
  • Поведение было воспроизведено с помощью однопоточной команды управления, поэтому оно не связано с какой-либо проблемой http/веб-сервера.


Подробнее здесь: https://stackoverflow.com/questions/781 ... in-between

Вернуться в «Python»