Для создания API я использую Django Rest Framework.
Идея состоит в том, что пользователь загружает некоторые данные с помощью запроса POST. Эти данные загружаются в базу данных. После загрузки создается новый поток Python, выполняющий некоторые операции с указанными данными. Затем, когда операции завершаются, результат записывается в исходную запись базы данных.
При таком подходе API остается доступным, при этом операции выполняются в фоновом режиме. Пользователь может проверить статус операции с помощью GET-запроса.
По какой-то причине при попытке обновить запись с результатами операции я получил следующую ошибку:
SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async
Это сбивало с толку, поскольку функция работы и обновления уже выполнялась с использованием потока.
Я не получал ошибку, когда заменяя операции некоторыми простыми результатами макетного теста (строками). Даже при использовании time.sleep() в течение более длительного периода, чем потребовались бы фактические операции. Поэтому я подозреваю, что проблема как-то связана с выполняемыми мной операциями, хотя они вообще не взаимодействуют с Django.
Я решил проблему, создав новые потоки специально для сохранения обновленные данные в базе данных. Но мне все еще интересно: зачем это нужно?
@api_view(['POST'])
def create_job(request):
serializer = JobsSerializer(data=request.data)
if serializer.is_valid():
job = serializer.save()
job_thread = threading.Thread(target=trigger_operation, args=(job,)).start()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def trigger_operation(db_record):
db_record.status = Jobs.Status.WORKING
threading.Thread(target=db_record.save, args=()).start()
try:
results = actual_operation(db_record.url)
status = Jobs.Status.DONE
except Exception as e:
results = e
status = Jobs.Status.FAILED
finally:
db_record.status = status
db_record.results = results
threading.Thread(target=db_record.save, args=()).start()
Подробнее здесь: https://stackoverflow.com/questions/793 ... django-res
Почему мне нужно создавать новый поток для обновления записи базы данных? (Рамка отдыха Джанго) ⇐ Python
Программы на Python
1737037989
Anonymous
Для создания API я использую Django Rest Framework.
Идея состоит в том, что пользователь загружает некоторые данные с помощью запроса POST. Эти данные загружаются в базу данных. После загрузки создается новый поток Python, выполняющий некоторые операции с указанными данными. Затем, когда операции завершаются, результат записывается в исходную запись базы данных.
При таком подходе API остается доступным, при этом операции выполняются в фоновом режиме. Пользователь может проверить статус операции с помощью GET-запроса.
По какой-то причине при попытке обновить запись с результатами операции я получил следующую ошибку:
SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async
Это сбивало с толку, поскольку функция работы и обновления уже выполнялась с использованием потока.
Я не получал ошибку, когда заменяя операции некоторыми простыми результатами макетного теста (строками). Даже при использовании time.sleep() в течение более длительного периода, чем потребовались бы фактические операции. Поэтому я подозреваю, что проблема как-то связана с выполняемыми мной операциями, хотя они вообще не взаимодействуют с Django.
Я решил проблему, создав новые потоки специально для сохранения обновленные данные в базе данных. Но мне все еще интересно: зачем это нужно?
@api_view(['POST'])
def create_job(request):
serializer = JobsSerializer(data=request.data)
if serializer.is_valid():
job = serializer.save()
job_thread = threading.Thread(target=trigger_operation, args=(job,)).start()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def trigger_operation(db_record):
db_record.status = Jobs.Status.WORKING
threading.Thread(target=db_record.save, args=()).start()
try:
results = actual_operation(db_record.url)
status = Jobs.Status.DONE
except Exception as e:
results = e
status = Jobs.Status.FAILED
finally:
db_record.status = status
db_record.results = results
threading.Thread(target=db_record.save, args=()).start()
Подробнее здесь: [url]https://stackoverflow.com/questions/79361985/why-do-i-have-to-create-a-new-thread-for-updating-a-database-record-django-res[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия