Как перезапускать код по истечению времени, если он не выполнился?
У меня есть строчка кода, которая с помощью vk api получает последнее сообщения в vk. Иногда, как я понимаю из-за нестабильного интернет соединения, программа застревает на этой строчке кода и по сути бездействует (бесконечно грузит, а если перезапустить всё приходит в норму). Мне нужно сделать так, чтобы через 5 секунд эта строчка кода выполнялась заново или просто пропускалась, если она ещё не выполнилась. Код на python.
Вот часть кода:
my_token = 'токен'
session= vk_api.VkApi(token = my_token)
vk = session.get_api()
#Получает сообщения
def GetMessage(GId,vk):
VkInfoMessage={'items': [{'text': ''}]}
def GetMes(GId,vk):
VkInfoMessage={'items': [{'text': ''}]}
try:
#вот эта строчка
VkInfoMessage = vk.messages.getHistory(peer_id = GId, count=1)
except:
pass
return VkInfoMessage
time.sleep(0.3)
VkInfoMessage = GetMes(GId,vk)
Message = VkInfoMessage['items'][0]['text']
return Message
Ответы (3 шт):
Как вариант обернуть все это в поток:
import threading
import time
def main():
while True:
thread = threading.Thread(target=my_func)
thread.daemon = True
thread.start()
thread.join(5)
print("restart")
continue
def my_func():
time.sleep(100)
if __name__ == '__main__':
main()
Вместо my_func соответственно Ваш код.
Если вы собираетесь разместить бота на сервере, то скорее всего там будет линукс, поэтому можно настроить демона вроде systemd. Например, когда сервера ВК будут перезагружаться (обычно это в 2 часа ночи), ваша программа упадет, но демон поднимет её обратно. Так же плюсом можно отметить логирование статуса программы.
Пример из моего бота VK:
import vk_api
import random
import time
import traceback
vk = vk_api.VkApi(token="token")
while True:
try:
php = vk.method("messages.getHistory", {"count":1,"user_id":id владельца,"peer_id":id переписки})
count = php.get("count")
if count != 0:
peer_id = php.get("items")[0].get("peer_id")
text = php.get("items")[0].get("text")
att = php.get('items')[0].get('attachments')
from_id = php.get('items')[0].get("from_id")
ids = php.get("items")[0].get("id")
ids = str(ids)
text = text.lower()
name = vk.method("users.get",{"user_ids":str(from_id)})
fn = name[0].get("first_name")
rand = int(random.randint(1,1000))
if peer_id == 2000000184:
# Работа с данными в диалоге
time.sleep(3)
except Exception:
print(traceback.format_exc())
Пробуй, возможно traceback тебе поможет. Он никогда не падал, если только выдавал ошибки, при отключении от сервера VK. Ошибка выглядит вот так
vk_api.exceptions.ApiError: [38] Unknown application: could not get application
Обычно от 2 до 4 утра приходят