2016-07-08 17 views
0

"time"と "traffic light"パラメータを処理し、pickleファイルに保存し、別のスクリプトがpickleを読み込んで使用するWebサーバーを含むプロジェクトに取り組んでいますMQTTクライアント読み込みピクルファイルの応答が遅い、または応答がありません

import pickle 
import paho.mqtt.client as mqtt 
from datetime import datetime, date, time 
from threading import Timer 
date=datetime.now() 
print date 
try: 
    while True: 
     fp = open("shared.pkl", 'rb') 
     shared = pickle.load(fp) 
     if date < shared["now"] : 
      time= shared["time"] 
      light = shared["light"] 
      date = shared["now"] 
      fp.close() 
      time= int(time) 
      def pub (s): 
       client.publish("traffic/light1", payload = s ,qos=0, retain=False) 
      t= Timer(time , pub,[light]) 
      t.start() 
      print time 
      print light 
      print date 




     client = mqtt.Client() 


     client.connect("localhost", 1883, 60) 

# Blocking call that processes network traffic, dispatches callbacks and 
# handles reconnecting. 
# Other loop*() functions are available that give a threaded interface and a 
# manual interface. 

     client.loop(timeout=1.0, max_packets=1) 

except (EOFError, UnpicklingError): 
    pass 

それが良い動作しますが、時にはそれが公表していないか、PKLファイルを読み取れません!! 提案がありますか?

+0

多分詳細は何ですか?あなたが何を見ているのか、あなたが何を観察しているのかを示してください。ありがとう。 – Dilettant

+0

MQTTエラーがないと仮定すると、ループは 'client.loop()'コールで永遠にブロックされるので一度だけ実行されます。これは、ファイルを一度だけ開いて読み込むことを意味します。 – hardillb

+0

'loop()'はブロックせず、 'loop_forever()'はブロックしません。 – ralight

答えて

1

あまりにも綿密に見ないと、以下のようなものが仕事をするはずです。

client.loop()を呼び出すと、ちょうど少しのネットワークトラフィックが処理されるだけで、すべてのトラフィックが送信されたことを保証することはできません。非同期/ブロック動作を使用するかどうかによって、loop_start()またはloop_forever()を使用します。

client = mqtt.Client() 
client.connect("localhost", 1883, 60) 

client.loop_start() 

print date 

while True: 
    try: 
     fp = open("shared.pkl", 'rb') 
     shared = pickle.load(fp) 
     fp.close() 
    except (EOFError, UnpicklingError): 
     continue 

    if date < shared["now"] : 
     time= shared["time"] 
     light = shared["light"] 
     date = shared["now"] 

     time= int(time) 
     def pub (s): 
      client.publish("traffic/light1", payload = s ,qos=0, retain=False) 
     t= Timer(time , pub,[light]) 
     t.start() 
     print time 
     print light 
     print date 
関連する問題