Execução de parte do código Python em segundo plano de forma independente.

102 views
Skip to first unread message

Wendell Mosquini Pozzatti

unread,
May 2, 2017, 6:29:34 PM5/2/17
to Python Brasil
Prezados, estou com uma dificuldade para executar a arte do código abaixo em segundo plano, ou seja, de forma independente do resto da aplicação.
Obs: sou novo em programação em python, cheguei a olhar algumas coisas sobre Threads, mas não consegui implementar.

if(estadoLam == 1):
        print "Entrou no if"
        while (estadoLam == 1):
            print "Entrou no while"
            lampada = 7 #potencia do disposito em watts
            convlam = (((lampada/60)/60)/1000) #conversao da ((potencia do dispositivo / h(em minutos))/ conversao kwh)
            c.execute("INSERT INTO energia (dispositivo,kwh) VALUES ('LAM', '%s')"%(convlam)) #salva dados da l?mpada no banco
            con.commit() #commit
            time.sleep(10)

A função deste código é inserir os dados de consumo no banco quando a variável "estadoLam" estiver o estado 1 (quando ela estiver ligada).
Essa variável é alterada de acordo com o usuário (quando é solicitado para ligar/desligar a lâmpada). Essa parte do código deverá monitorar a cada minuto o valor armazenado na variável estadoLam até que esteja 1 para iniciar ou 0 para encerrar o loop. Se a lâmpada estiver ligada, o processo deverá continuar rodando a cada minuto, as informações salvas no banco até que a lâmpada seja desligada (=0) e então , ficará aguardando até que a variável seja 1 novamente.

Vinicius Dantas

unread,
May 3, 2017, 6:59:24 AM5/3/17
to Python Brasil
Ola, Wendell!

Por que nao atualizar o banco de dados quando o usuario altera o valor?

Filipe Cifali

unread,
May 3, 2017, 7:02:52 AM5/3/17
to python...@googlegroups.com
Usando o que o Vinicius falou é a melhor forma, você pode armazenar no banco de dados quando foi ligada a lâmpada e quando foi desligada, assim podendo depois calcular o consumo dela de maneira separada (junto com outras lampadas e todo o resto do consumo de luz)

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasil+unsubscribe@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
[ ]'s

Filipe Cifali Stangler

Wendell Mosquini Pozzatti

unread,
May 3, 2017, 7:16:00 AM5/3/17
to Python Brasil
Oi Vinicius e Filipe,

Na verdade, o que estou desenvolvendo é um sistema web, isso tudo será utilizado junto com Arduino, exatamente por isso que essa parte do programa deve ser executado de forma independente.
Já tentei de várias maneiras fazer com que os dados sejam armazenados no banco enquanto o dispositivo esteja ligado. O motivo de já armazenar os dados do consumo é que serão utilizados para exibir em formato de gráfico no ambiente Web, já estou adicionando o consumo para questão de agilidade, pois de qualquer forma teria que adicionar o período em que a lâmpada ficou ligada (a cada segundo).

Filipe Cifali

unread,
May 3, 2017, 7:21:03 AM5/3/17
to python...@googlegroups.com
Entendo, mas você tendo a hora que ligou e a hora que desligou você sabe o tempo e consegue calcular o consumo.

AFAIK lampadas tem consumo estável de energia.

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasil+unsubscribe@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Wendell Mosquini Pozzatti

unread,
May 3, 2017, 7:40:43 AM5/3/17
to Python Brasil
Então, quanto ao consumo, isso pode ser calculado em outro momento, é importante que seja armazenado o tempo em que o dispositivo esteja ligado.
Essa informação precisa de ser armazenada pois haverá mais de um tipo de dispositivo (rádio, tv, etc), no sql é feito a inserção do ID (dispositivo).
Esse código funciona, preciso apenas de colocar ele executando em segundo plano, monitorando quando a variável de controle (estadoLam) tem alteração. A alteração é feita de acordo com a escolha do usuário em ligar e desligar o dispositivo no ambiente Web, o valor é retornado do arduino.

Em quarta-feira, 3 de maio de 2017 08:21:03 UTC-3, Filipe Cifali escreveu:
Entendo, mas você tendo a hora que ligou e a hora que desligou você sabe o tempo e consegue calcular o consumo.

AFAIK lampadas tem consumo estável de energia.
2017-05-03 8:16 GMT-03:00 Wendell Mosquini Pozzatti <pen...@gmail.com>:
Oi Vinicius e Filipe,

Na verdade, o que estou desenvolvendo é um sistema web, isso tudo será utilizado junto com Arduino, exatamente por isso que essa parte do programa deve ser executado de forma independente.
Já tentei de várias maneiras fazer com que os dados sejam armazenados no banco enquanto o dispositivo esteja ligado. O motivo de já armazenar os dados do consumo é que serão utilizados para exibir em formato de gráfico no ambiente Web, já estou adicionando o consumo para questão de agilidade, pois de qualquer forma teria que adicionar o período em que a lâmpada ficou ligada (a cada segundo).

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

Vinicius Dantas

unread,
May 3, 2017, 7:52:59 AM5/3/17
to python...@googlegroups.com
Estamos insistindo porque, embora deixar isso rodando em segundo plano resolva, parece nao ser a melhor opcao para o seu caso. Paralelizar (adicionar em segundo plano) adiciona uma complexidade a teu programa e essa complexidade nao nos parece valer a pena, ja que seu problema pode ser resolvido de forma mais simples

python-brasil+unsubscribe@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito em um tópico no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse tópico, acesse https://groups.google.com/d/topic/python-brasil/BRa9c40BUGQ/unsubscribe.
Para cancelar inscrição nesse grupo e todos os seus tópicos, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.



--
Vinícius Dantas de Lima Melo
Graduando em Ciências e Tecnologia 
Universidade Federal do Rio Grande do Norte (UFRN)
Escola de Ciências e Tecnologia (ECT)
Natal, Rio Grande do Norte
viniciu...@gmail.com viniciu...@bct.ect.ufrn.br vinicius.dan...@mail.utoronto.ca | Celular/Mobile Phone: +1 647 447 5737
Skype: viniciusdantas01

Wendell Mosquini Pozzatti

unread,
May 3, 2017, 8:01:23 AM5/3/17
to Python Brasil
Alguma ideia de como posso resolver esse problema de maneira fácil?
Como sou meio leigo em python, não consigo ter ideia de mais qual forma posso solucionar essa questão.
Você recebeu essa mensagem porque está inscrito em um tópico no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse tópico, acesse https://groups.google.com/d/topic/python-brasil/BRa9c40BUGQ/unsubscribe.
Para cancelar inscrição nesse grupo e todos os seus tópicos, envie um e-mail para python-brasi...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.



--

Vinicius Assef

unread,
May 3, 2017, 8:50:33 AM5/3/17
to python...@googlegroups.com
Seu while está em loop infinito!

Wendell Mosquini Pozzatti

unread,
May 3, 2017, 9:50:07 AM5/3/17
to Python Brasil
Vai ser infinito enquanto o dispositivo estiver ligado, o que é o objetivo, quando desligado, a variável muda para 0 e o while para de ser executado, mas essa que é a questão. Enquanto a variável for = 1, o loop vai executar novamente  a cada 1 min, quando a validação for = 0 (desligado), ele para o loop. Acredito que seja essa a lógica, mas por favor, me corrijam se estiver errado. 

Vinicius Assef

unread,
May 3, 2017, 9:57:55 AM5/3/17
to python...@googlegroups.com
Repito: seu código está em loop infinito.

Verifique a lógica.

Vinicius Assef

unread,
May 3, 2017, 10:00:10 AM5/3/17
to python...@googlegroups.com
2017-05-03 10:50 GMT-03:00 Wendell Mosquini Pozzatti <pen...@gmail.com>:
>
> quando desligado, a variável muda para 0

Onde?

> quando a validação for = 0 (desligado), ele para o
> loop.

Onde?


Você não tem esse controle de saída do while no código que vc mostrou.

Thiago

unread,
May 3, 2017, 10:28:30 AM5/3/17
to python...@googlegroups.com
Oi.

Se você está certo de que a programação assíncrona não vai te ajudar a
resolver o problema e precisa mesmo de um thread, fiz um miniprograma
baseando-se no seu para demonstrar como criar dois threads de execução.

import time
import threading
estadoLam = 1
class Cursor:
"""Classe para testar o programa."""
def execute(self, *args):
print(args)

class Connection:
"""Classe para testar o programa."""
def commit(self):
pass

c = Cursor()
con = Connection()

def verificaLampada():
while True:
if estadoLam == 1:
lampada = 7 #potencia do disposito em watts
convlam = (((lampada/60)/60)/1000) #conversao da ((potencia
do dispositivo / h(em minutos))/ conversao kwh)
c.execute("INSERT INTO energia (dispositivo,kwh) VALUES
('LAM', '%s')"%(convlam)) #salva dados da l?mpada no banco
con.commit() #commit
time.sleep(10)

def ligaOuDesliga():
global estadoLam
while True:
ligar = input("Ligar a lampada?").upper()
if ligar == "S":
estadoLam = 1
elif ligar == "N":
estadoLam = 0
else:
print("Tecla invalida.")
break

t = threading.Thread(target=verificaLampada, daemon=True)
t.start()
ligaOuDesliga()

Wendell Mosquini Pozzatti

unread,
May 3, 2017, 10:47:13 AM5/3/17
to Python Brasil
A variável estadoLam é responsável por receber essas informações que são enviadas do arduino.

Filipe Cifali

unread,
May 3, 2017, 10:47:23 AM5/3/17
to python...@googlegroups.com
Wendell,

não sei se ficou claro mas o que EU armazenaria no banco:

id (do dispositivo), powerOnTime (data e hora quando foi ligado), powerOffTime (por padrão será 0000-00-00 00:00:00 e receberá um update quando o dispositivo for desligado).

Assim eu não precisa inserir um para cada segundo e depois somar todos eles para saber quanto tempo ficou ligado o dispositivo x, apenas iria calcular o timedelta.

Imagina o cenário caótico que seria ter 6 lampadas ligadas por mais de 1 dia com um registro para cada lampada...



---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

Wendell Mosquini Pozzatti

unread,
May 3, 2017, 10:52:55 AM5/3/17
to Python Brasil
Obrigado Thiago pela ajuda,
tenho as funções de ligar e desligar a lâmpada prontos: 
def ligar_lam():
 
   try:          
       conexao.write('1')
       estadoLam = conexao.read()
       if(estadoLam == "1"):
          print 'Lampada ligada'   
 
   except serial.SerialException:
       print'ERRO: Verifique se ha algum dispositivo conectado na porta!'
 

onde é responsável por fazer a conexão com o arduino, enviar a solicitação e receber o retorno do mesmo. Neste caso, posso colocar essa função junto com a thread?

Wendell Mosquini Pozzatti

unread,
May 3, 2017, 11:00:26 AM5/3/17
to Python Brasil
Então Filipe, seu questionamento está correto e é bem útil, mas para que isso ocorra, teria que adicionar mais algumas linhas na função de desligar, não é nada complicado, mas para um TCC, quero ser o mais objetivo possível, mais a sua opinião é uma possibilidade. 

Thiago

unread,
May 3, 2017, 11:09:29 AM5/3/17
to python...@googlegroups.com
No caso, essas funções de ligar e desligar a lâmpada seriam executadas
no thread principal do programa. Observa que no meu exemplo, um thread
ficou responsável pelo envio dos registros ao banco de dados e o outro
ficou responsável por controlar a lâmpada. Não é que elas estão
"juntas", uma roda num thread e outra roda no outro.

Se você se referiu a colocar as funções no mesmo arquivo não tem
problema, mas você tem que cuidar em qual dos threads ela vai ser
executada. Basicamente, a função ligaOuDesliga do meu exemplo executa no
thread principal e a função verificaLampada executa num thread
secundário que só envia as coisas para o banco de dados.

Wendell Mosquini Pozzatti

unread,
May 3, 2017, 11:11:05 AM5/3/17
to Python Brasil
Vinicius, talvez essa parte do código facilite entender o que estou tentando fazer:
def ligar_lam():
   try:          
      conexao.write('1')
      estadoLam = conexao.read()
      if(estadoLam == "1"):
         print 'Lampada ligada'  
 
  except serial.SerialException:
      print'ERRO: Verifique se ha algum dispositivo conectado na porta!'


Em quarta-feira, 3 de maio de 2017 11:00:10 UTC-3, Vinicius Assef escreveu:

Wendell Mosquini Pozzatti

unread,
May 3, 2017, 11:20:12 AM5/3/17
to Python Brasil
fiz uma pequena alteração no seu código, estaria correto desta forma?

import time 
import threading 
estadoLam = 1 
class Cursor: 
     """Classe para testar o programa.""" 
     def execute(self, *args): 
         print(args) 

class Connection: 
     """Classe para testar o programa.""" 
     def commit(self): 
         pass 

c = Cursor() 
con = Connection() 

def verificaLampada(): 
     while True: 
         if estadoLam == 1: 
             lampada = 7 #potencia do disposito em watts 
             convlam = (((lampada/60)/60)/1000) #conversao da ((potencia 
do dispositivo / h(em minutos))/ conversao kwh) 
             c.execute("INSERT INTO energia (dispositivo,kwh) VALUES 
('LAM', '%s')"%(convlam)) #salva dados da l?mpada no banco 
             con.commit() #commit 
             time.sleep(10) 

def menu():
    opcao = 0
    while (opcao != 3):
            print"==========================================="
            print"===== 1 - ligar Lampada ====="
            print"===== 2 - desligar Lampada   ====="
            print"===== 2 - desligar Lampada   ====="
            print"==========================================="
            opcao = int (raw_input("Digite a Opcao: "))
            if opcao == 1:
                ligar_lam()
            elif opcao == 2:
                desli_lam()
            elif opcao == 3:
                c.close() #encerra conexao
                con.close()
                conexao.close()
                exit(0)  
            else:
               print"Entrada Invalida!!"

def ligar_lam():
global estadoLam
   try:          
       conexao.write('1')
       estadoLam = conexao.read()
       if(estadoLam == "1"):
          print 'Lampada ligada'   
 
   except serial.SerialException:
       print'ERRO: Verifique se ha algum dispositivo conectado na porta!'

def desli_lam(): 
global estadoLam
   try:    
       conexao.write('2')
       estadoLam = conexao.read()
       if(estadoLam == "2"):
          print 'Lampada desligada'
      
   except serial.SerialException:
       print'ERRO: Verifique se ha algum dispositivo conectado na porta!'
  
t = threading.Thread(target=verificaLampada, daemon=True) 
t.start() 
menu() 

Filipe Cifali

unread,
May 3, 2017, 11:20:38 AM5/3/17
to python...@googlegroups.com
Certo,

ao meu ver isso abre outros problemas de performance para o teu TCC que deveriam ser contestados, mas esta é apenas a minha opinião.

Considerando o estado da lampada, você não precisa implementar a função de desligar ela, pois você tem como saber o estado dela, apenas irá inserir ou atualizar conforme o estado atual.



---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

Wendell Mosquini Pozzatti

unread,
May 3, 2017, 11:34:18 AM5/3/17
to Python Brasil
Concordo e vou revisar, o principal de tudo era conseguir rodar a a parte do código em segundo plano, resolvendo isso, consigo ter tempo para revisar e melhorar todo o código.

Thiago

unread,
May 3, 2017, 11:37:42 AM5/3/17
to python...@googlegroups.com
Sim, o menu fica num thread e o envio para o banco de dados fica em outro.

A razão pela qual eu comentei sobre os dois threads de execução é que os
threads são como dois programas. Tudo que está na função verificaLampada
roda num thread e o resto (o que não está nela) roda no thread
principal. Foi só uma observação porque eu pensei que você tivesse
achado que as funções ligaOuDesliga e a verificaLampada fizessem parte
de um thread só.

Wendell Mosquini Pozzatti

unread,
May 3, 2017, 11:44:07 AM5/3/17
to Python Brasil
entendi claramente.
vou tentar implementar no período da noite.
Obrigado pela ajuda :)
Reply all
Reply to author
Forward
0 new messages