Продолжайте получать django.db.utils.ProgrammingError: нет результатов для извлечения при запуске более 4 процессов - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть скрипт, который обрабатывает данные.Когда я называю это с 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.По сути, эта программа разделяет данные по расстоянию и профилю, а затем обрабатывает их и добавляет в базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...