Я столкнулся с проблемой в последнее время. У меня есть конечная точка API, которая создает объекты в натуральном выражении. Непосредственно перед возвратом HTTPResponse он запускает поток, который вызывает другую конечную точку (в том же приложении), которая принимает объекты, созданные массово (в первую очередь), и выполняет некоторые операции с этими объектами. Например: обновление этих задач с некоторыми дополнительными параметрами и публикация этих задач в очереди сообщений.
Например: если я создал 10 объектов задач, конечная точка затем возьмет эти 10 задач, обновит их и опубликует sh их соответственно в последовательности, в которой они созданы.
thread = Thread(target=publish_bulk_tasks, args=(tasks_list,token,host))
thread.start()
Это функция, которая публикует задачи:
import requests
import json
def publish_bulk_tasks(tasks_list, token, host):
data = {"tasks": tasks_list}
response = requests.post(host + '/api/v1/tasks/send_bulk_tasks/',
data=json.dumps(data, indent=4, sort_keys=True, default=str, ).replace(
'\\"',
"\""),
headers={'Content-Type': 'application/json',
'Authorization': token}).json()
Это ошибка, которую я получаю:
psycopg2.errors.SerializationFailure: could not serialize access due to read/write dependencies among transactions
DETAIL: Reason code: Canceled on identification as a pivot, during write.
HINT: The transaction might succeed if retried.
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\test_project\api\tasks\thread_handler.py", line 29, in run
self.ret = self._target(*self._args, **self._kwargs)
File "C:\test_project\api\tasks\task.py", line 680, in watch_task
vm=None)
File "C:\test_project\api\tasks\utils.py", line 218, in update_task
task_obj.save()
Теперь фрагмент кода, который является причиной этой ошибки:
task_obj.ad_domain_name = domain
try:
vm = VMDetails.objects.get(id=vm)
task_obj.vm = vm
except:
pass
task_obj.save()