У меня есть скрипт, который обрабатывает данные.Когда я называю это с 1-3 процессами, это, кажется, работает хорошо.Однако, как только я пытаюсь запустить его с 6 или более процессами, выдает ошибки django, и я получаю django.db.utils.ProgrammingError: нет результатов для извлечения
Я прочиталв нескольких потоках, где они сказали, что исправили это в более поздней версии psychopg2, поэтому я попытался обновить свой пакет, и в настоящее время я пользуюсь версией 2.8, но я все еще получаю сообщение об ошибке.
РЕДАКТИРОВАТЬ: Я заметил одну вещь:ошибка происходит, когда 2 процесса пытаются одновременно bulk_create
.В настоящее время я думаю о блокировке соединения с базой данных, но я не уверен,
Код, который делает процессы
for profile_name in profiles_to_run:
t1 = Process(target=self.run_profile_for_inspection, args = (odometer_start,odometer_end,inspection,profile_name,robot_inspection_id))
t1.start()
list_of_threads.append(t1)
thread_count = thread_count + 1
return list_of_threads
def run_profile_for_inspection(self, odometer_start, odometer_end,portal_inspection, profile_name, robot_inspection_id):
self.out("Running inspection {} from {}m to {}m for {}".format(portal_inspection.pk, odometer_start, odometer_end,profile_name))
rerun_profile = ReRunProfile(self._options['db_name'],self.out,profile_name, portal_inspection.pk, robot_inspection_id)
# rerun_profile.set_odometer_start_and_end(odometer_start,odometer_end)
rerun_profile.handle_already_created_inspections()
В ReRunProfile оператор get является тем, что он ошибается, если естьСлишком много процессов Это псевдокод
def handle_already_created_inspections(self):
con = psycopg2.connect(dbname=self.database)
time.sleep(10)
robot_inspection_id = self.get_robot_inspection_id(self.portal_inspection_id)
portal_inspection = Inspection.objects.get(pk=self.portal_inspection_id)
with con.cursor() as cur:
cur.execute('Select * from data where start < odometer_start and end > odometer_end and profile = profile')
count = 0
processed_data = []
for row in cur:
processed_data.append(row.process())
count = count + 1
if count == 20:
Profile.objects.bulk_create(processed_data) #errors out here too
count = 0
process_data = []
РЕДАКТИРОВАТЬ: Кто-то спросил, что делает bulk_create.По сути, эта программа разделяет данные по расстоянию и профилю, а затем обрабатывает их и добавляет в базу данных.