Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

Вопрос Можно ли пользоваться циклами в бэкенде?

  • Автор темы Автор темы d0zlove
  • Дата начала Дата начала
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
10 Апр 2022
Сообщения
101
Реакции
8
не будет ли приводить такой код к тому что сервер сложится? и если будет, то чем можно заменить данный кусок кода?
Код:
Expand Collapse Copy
if sf.checkKeyExists(shortURL):
    while True:
        print("Ключ уже существует.")
        shortURL = createSURL()
        print("Создан новый.")
        if not sf.checkKeyExists(shortURL):
            break
else:
    print("Ключ еще не существует.")
 
Этот код может привести к бесконечному циклу, если функция createSURL() продолжает генерировать ключи, которые уже существуют. Это может привести к кирдык сервера, если он не может быстро обрабатывать запросы. В этом коде, если ключ не создается после определенного количества попыток (в данном случае 1000) если ошибка то напиши мне
Код:
Expand Collapse Copy
max_attempts = 1000
for attempt in range(max_attempts):
    if sf.checkKeyExists(shortURL):
        print("Ключ уже существует.")
        shortURL = createSURL()
        print("Создан новый.")
        if not sf.checkKeyExists(shortURL):
            break
    else:
        print("Ключ еще не существует.")
        break
else:
    print("Не удалось создать ключ после", max_attempts, "попыток.")
 
если он не может быстро обрабатывать запросы
что блядь? у тебя линейная программа, тут к гадалке не ходи что sf.checkKeyExists не вернет ниче раньше чем сервак ответит;

другой вопрос что у опа всё тело отстреливается в while True: луп (который ещё и убивается без предупреждения или лога). если твой сервак не может работать быстро, или у тебя лимит по компьюту - ебанул огран по запросам к бд или в тупую time.sleepов
 
Этот код может привести к бесконечному циклу, если функция createSURL() продолжает генерировать ключи, которые уже существуют. Это может привести к кирдык сервера, если он не может быстро обрабатывать запросы. В этом коде, если ключ не создается после определенного количества попыток (в данном случае 1000) если ошибка то напиши мне
Код:
Expand Collapse Copy
max_attempts = 1000
for attempt in range(max_attempts):
    if sf.checkKeyExists(shortURL):
        print("Ключ уже существует.")
        shortURL = createSURL()
        print("Создан новый.")
        if not sf.checkKeyExists(shortURL):
            break
    else:
        print("Ключ еще не существует.")
        break
else:
    print("Не удалось создать ключ после", max_attempts, "попыток.")
А не проще использовать алгоритм, который изначально имеет минимальное количество коллизий? Условный RFC 4122 дает чуть ли не полную гарантию (1 in 2.71 x 1018) того, что у тебя коллизий не будет.


Ты там сервер положить решил такими запросами? Насколько я понимаю - это что то из разряда URL Shortener, и если тебе нужны очень короткие URL'ы, то есть тогда еще такой вариант - можно в постгре сделать функцию для генерации, которая будет генерить айдишники, условные 5 попыток, на каждую попытку увеличивает длину строки на +1 (не забываем залочить инсерты в таблице). Таким образом у тебя будет минимальное количество запросов к самой базе данных, и сама база данных будет минимально нагружена запросами, особенно если накинешь хеш индекс на урлы. Но я все же рекомендую посмотреть в сторону алгоритмов, которые сами по себе генерируют строки с минимально возможной коллизией, хоть они и вероятней всего будут более длинные.
 
Последнее редактирование:
А не проще использовать алгоритм, который изначально имеет минимальное количество коллизий? Условный RFC 4122 дает чуть ли не полную гарантию (1 in 2.71 x 1018) того, что у тебя коллизий не будет.



Ты там сервер положить решил такими запросами? Насколько я понимаю - это что то из разряда URL Shortener, и если тебе нужны очень короткие URL'ы, то есть тогда еще такой вариант - можно в постгре сделать функцию для генерации, которая будет генерить айдишники, условные 5 попыток, на каждую попытку увеличивает длину строки на +1 (не забываем залочить инсерты в таблице). Таким образом у тебя будет минимальное количество запросов к самой базе данных, и сама база данных будет минимально нагружена запросами, особенно если накинешь хеш индекс на урлы. Но я все же рекомендую посмотреть в сторону алгоритмов, которые сами по себе генерируют строки с минимально возможной коллизией, хоть они и вероятней всего будут более длинные.
Ты вернулся!
 
А не проще использовать алгоритм, который изначально имеет минимальное количество коллизий? Условный RFC 4122 дает чуть ли не полную гарантию (1 in 2.71 x 1018) того, что у тебя коллизий не будет.



Ты там сервер положить решил такими запросами? Насколько я понимаю - это что то из разряда URL Shortener, и если тебе нужны очень короткие URL'ы, то есть тогда еще такой вариант - можно в постгре сделать функцию для генерации, которая будет генерить айдишники, условные 5 попыток, на каждую попытку увеличивает длину строки на +1 (не забываем залочить инсерты в таблице). Таким образом у тебя будет минимальное количество запросов к самой базе данных, и сама база данных будет минимально нагружена запросами, особенно если накинешь хеш индекс на урлы. Но я все же рекомендую посмотреть в сторону алгоритмов, которые сами по себе генерируют строки с минимально возможной коллизией, хоть они и вероятней всего будут более длинные.
а реально, чет я не додумался размер строки менять, спасибо за идею)
 
а реально, чет я не додумался размер строки менять, спасибо за идею)
Только не забудь реализовать это функцией в самой базе данных, а не отдельными запросами от твоего приложения.
 
Назад
Сверху Снизу