title: Publish and subscribe both ways using MQTT Python
body: <p>I currently have a Python program written on the Raspberry Pi 3 to read in humidity and temperature sensor data and publish this data to a topic. I can then receive this data using my laptop. Here is my code for <strong>reading sensor data and publishing it to a topic from my Raspberry Pi</strong>: </p>
  
  <pre><code>import RPi.GPIO as GPIO
  import time
  import json
  import Adafruit_DHT as dht
  import math
  import paho.mqtt.publish as publish
  import paho.mqtt.client as mqtt
  # Creating the JSON Objects
  
  dht22 = {}
  arduino = {}
  dht22Temp = []
  dht22Hum = []
  arduinoLED = []
  
  
  dht22['temperature'] = dht22Temp
  dht22['humidity'] = dht22Hum
  dht22['sensor'] = 'DHT22'
  
  arduino['blink'] = arduinoLED
  arduino['actuator'] = 'arduinoLED'  
  
  # Timing constants
  E_PULSE = 0.0005
  E_DELAY = 0.0005
  
  def main():
    # Main program block
    while True:
  
      h, t = dht.read_retry(dht.DHT22, 17) //Reading humidity and temp data from GPIO17
      t = round(t,2)
      h = round(h,2)
  
      if t &gt; 25: 
        if len(arduinoLED) == 3:
          arduinoLED.pop(0)
          arduinoLED.append("true")
        else: 
          arduinoLED.append("true")
      else:
        if len(arduinoLED) == 3:
          arduinoLED.pop(0)
          arduinoLED.append("false")
        else: 
          arduinoLED.append("false")
      if len(dht22Temp) == 3:
        dht22Temp.pop(0)
        dht22Temp.append(t)
      else: 
        dht22Temp.append(t)
      if len(dht22Hum) == 3:
        dht22Hum.pop(0)
        dht22Hum.append(h)
      else: 
        dht22Hum.append(h)
      # lm35dzTemp.append(tempc) 
  
  
      # Publishing sensor information by JSON converting object to a string
      publish.single("topic/sensorTemperature", json.dumps(dht22), hostname = "test.mosquitto.org")
      publish.single("topic/sensorTemperature", json.dumps(arduino), hostname = "test.mosquitto.org")
  
      # Printing JSON objects
      print(dht22)
      print(arduino)
      time.sleep(2)
  
  if __name__ == '__main__':
  
    try:
      main()
    except KeyboardInterrupt:
      pass
    finally:
  
      GPIO.cleanup()
  </code></pre>
  
  <p>Here is my code for <strong>subscribing and receiving data from my laptop:</strong> </p>
  
  <pre><code>import paho.mqtt.client as mqtt
  import json
  
  # This is the Subscriber
  def on_connect(client, userdata, flags, rc):
      print("Connected with result code " + str(rc))
      client.subscribe("topic/sensorTemperature")
  
  
  def on_message(client, userdata, msg):
      print(json.loads(msg.payload)) #converting the string back to a JSON object
  
  client = mqtt.Client()
  
  client.on_connect = on_connect
  client.on_message = on_message
  
  client.connect("test.mosquitto.org", 1883, 60)
  
  client.loop_forever()
  </code></pre>
  
  <p>What I want to do is now publish something from my laptop (perhaps in the same code as the subscriber, or in a separate file that will just publish a message to the same topic - <code>"topic/sensorTemperature"</code>). But my <strong>question</strong> is: how do I also publish and subscribe to messages on my Raspberry Pi (in my first code that I published)? Since I am publishing messages in an infinite loop to my laptop, I will also need an infinite loop to subscribe to the same (or different topic) to receive messages. How do you run two of these loops at once? Will I need two different threads? </p>
  
  <p>Thank you. </p>