Многопоточность с обновлениями до MySQL - PullRequest
0 голосов
/ 29 марта 2020

Мне нужно оценивать около 80 тыс. Строк данных каждый день в 11 утра, и я надеюсь выполнить sh в течение нескольких минут.

Я использовал многопоточность, которая использует select_for_update () из Django, что получает по одной строке за раз, обновляет ее, а затем получает новую строку.

Проблема в том, что существует проблема, при которой счетчик увеличивается слишком быстро, предполагая, что в некоторых случаях строка оценивается дважды .

Вот мой текущий блок кода:

while True:
        with transaction.atomic():
            user_history = UserHistory.objects.select_for_update().filter(is_finished=False).first()
            if user_history:
                user = UserProfile.objects.filter(id=user_history.user_profile_id).first()
                card_today = CardToday.objects.filter(id=user_history.card_today_id).first()
                rewarded_value = 0
                if user_history is item1:
                    if card_today.item1 > card_today.item2:
                        rewarded_value = card_today.item2/card_today.item1 + 1
                elif user_history is item2:
                    if card_today.item2 > card_today.item1:
                        rewarded_value = card_today.item1/card_today.item2 + 1

                user.coins += float(user.coins) + rewarded_value # the value increases too high here

                user.save()
                user_history.save()
            else
                break

Это модель для Card Today:

class CardToday(models.Model):
   item1 = models.IntegerField(default=0)
   item2 = models.IntegerField(default=0)

Это модель для истории пользователей:

class UserHistory(models.Model):
   card_today = models.ForeignKey(CardToday, on_delete=models.CASCADE)
   answer_item = models.ForeignKey(Item, on_delete=models.CASCADE)
   is_finished = models.BooleanField(default=False) // checks whether the card has already been evaluated.

вычисление вознагражденного значения выполняется следующим образом:

rewarded_value = majority/minority + 1

переключение большинства и меньшинства в зависимости от того, какой элемент имеет большее значение.

Каждый user_history может выбирать только из item1 или item2.

По прошествии определенного времени код определит, какой предмет был выбран в CardToday.

Есть ли лучший способ сделать это?

фреймворк, который я использую - Django, и из библиотеки django -cron выполняется задание cron.

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