Agendando Tarefas no Python

Fala Pythonistas! Tudo certo?

Já teve que fazer a mesma tarefa todo santo dia no computador? Aquela tarefa que você sabe que dá pra automatizar ao invés de ficar tirando 30 minutos todo dia pra resolver?

Seus problemas acabaram! (Tabajara Feelings.)

No Python, temos a biblioteca ou lib (Como quiser chamar.) chamada schedule, que faz justamente esse processo de agendamento na linguagem que estamos estudando.

Sem mais enrolação, vamos pro código.

Inicialmente, vamos configurar o ambiente para o código:

Importe as bibliotecas colocando o bloco de código a seguir no inicio do seu script:

import schedule
import time
from random import randint
from datetime import datetime

Criei três funções para representarmos as tarefas a serem executadas no agendamento:

def print_blog_de_python() -> None:

    """
    Imprime a string 'Blog de Python'.

    :return: None
    """

    print('Blog de Python')


def sum_two_values_and_print() -> None:

    """
    Soma dois numeros aleatórios e imprime essa soma.

    :return: None
    """

    random_number1 = randint(1, 10)
    random_number2 = randint(1, 10)
    sum_random_numbers = random_number1 + random_number2
    print(sum_random_numbers)


def print_datetime_today() -> None:

    """
    Pega a data atual e imprime.

    :return: None
    """

    print(datetime.today().strftime('%d-%m-%Y %H:%M:%S'))

Após ter essas funções no seu script Python, podemos começar a realmente realizar o agendamento, por exemplo:

  • Para agendar uma tarefa a cada 5 segundos:
schedule.every(5).seconds.do(tarefa)
  • Para agendar uma tarefa a cada 5 minutos:
schedule.every(5).minutes.do(tarefa)
  • Para agendar uma tarefa a cada 5 horas:
schedule.every(5).hours.do(tarefa)

Você pode adicionar no lugar da "tarefa", a chamada das funções que mostrei acima, por exemplo:

schedule.every(5).seconds.do(print_blog_de_python)
schedule.every(5).minutes.do(sum_two_values_and_print)
schedule.every(5).hours.do(print_datetime_today)

Para entendermos um pouco mais da sintaxe, sabemos que:

biblioteca.Situação(Quantidade de Tempo).Tempo.Tarefa

  • schedule = Representa o módulo da biblioteca.
  • every() = Representa a situação a ser executado (Para cada).
  • seconds = Tempo a ser executado.
  • do() = Representa "o que fazer".

Temos diversas opções de período, como dias, semanas, horas, minutos, segundos e entre outros períodos para programar.

Caso queira saber mais sobre esses períodos, basta acessar a documentação oficial do schedule para informações detalhadas.

Após as instruções acima, vamos finalmente executar o código, para executá-lo, vamos colocar tudo dentro de um loop infinito com while, para que ele vá executando de acordo com que programamos:

schedule.every(5).seconds.do(print_blog_de_python)
schedule.every(10).seconds.do(sum_two_values_and_print)
schedule.every(15).seconds.do(print_datetime_today)

while True:
    schedule.run_pending()
    time.sleep(1)

A função "run_pending()", como o nome diz, pega todos os agendamentos pendentes para serem executados dentro do loop:

image.png


Para saber quais as tarefas que estão em execução, após os agendamentos, adicione:

schedule.get_jobs()

O get_jobs() vai te mostrar a ultima vez que foi executado, quando vai executar e periodicidade que está sendo executado.

Para cancelar uma tarefa em andamento, basta adicionar:

print_datetime_job = schedule.every(1).seconds.do(print_datetime_today)
schedule.cancel_job(print_datetime_job)

Lembrando que o print_datetime_today é a função que criamos anteriormente.


Isso é tudo pessoal!

Se você ainda quer saber mais sobre o agendamento de tarefas no Python, basta acessar a documentação oficial da biblioteca schedule: schedule.readthedocs.io

Script completo:

import schedule
import time
from random import randint
from datetime import datetime


def print_blog_de_python() -> None:
    """
    Imprime a string 'Blog de Python'.

    :return: None
    """

    print('Blog de Python')


def sum_two_values_and_print() -> None:
    """
    Soma dois numeros aleatórios e imprime essa soma.

    :return: None
    """

    random_number1 = randint(1, 10)
    random_number2 = randint(1, 10)
    sum_random_numbers = random_number1 + random_number2
    print(sum_random_numbers)


def print_datetime_today() -> None:
    """
    Pega a data atual e imprime.

    :return: None
    """

    print(datetime.today().strftime('%d-%m-%Y %H:%M:%S'))


schedule.every(5).seconds.do(print_blog_de_python)
schedule.every(10).seconds.do(sum_two_values_and_print)
print_datetime_job = schedule.every(15).seconds.do(print_datetime_today)

while True:
    schedule.run_pending()
    time.sleep(1)

Até a próxima :)