Python paho-mqtt блокирует клиентский цикл

в настоящее время я пытаюсь написать программу, которая имитирует атаку, которая дала следующий код:

import requests
import threading
import paho.mqtt.client as mqtt

class Attack(object):

    def __init__(self):

        self.client = mqtt.Client()
        self.client.on_connect = self.on_connect
        self.client.on_message = self.on_message

        self.client.connect("test.mosquitto.org")
        self.client.loop_forever()

    def poll_heise(self):
        while(True):
            time.sleep(2)
            r = requests.get('https://heise.de')

    def on_connect(self):
        self.client.subscribe("ATTACK")
        thread = threading.Thread(target=self.poll_heise)
        thread.start()

    def on_message(self):
        for i in range(1,80):
            thread = threading.Thread(target=self.write_file,args=(i,))
            thread.start()

    def write_file(self,suffix):
        new_file = open("file{0}".format(suffix),"w")
        new_file.write("testtesttesttest")
        new_file.close()


if __name__ == "__main__":
    attack = Attack()

По сути, я хочу создать характерное поведение, которое будет поддерживаться (например, опрос heise.de с помощью запросов), а затем нарушить это поведение, когда придет сообщение MQTT на тему «АТАКА».

Однако, когда я запускаю код и пытаюсь вызвать метод on_message, публикуя на test.mosquitto.org «АТАКУ», я ничего не получаю. Насколько я знаю, интерпретатор даже не доходит до обратного вызова on_message. Я попытался опубликовать и подписаться на брокера mqtt вручную, и это сработало.

У кого-нибудь есть идеи, почему это не работает?

_ РЕДАКТИРОВАТЬ: я подозреваю, что это проблема с тем, как я обрабатываю потоки, или какой-то цикл блокируется, но я не могу определить, какой именно. Спасибо заранее.


person Daniel Siegel    schedule 17.09.2019    source источник


Ответы (1)


Строка self.client.loop_forever() является блокирующим вызовом, поэтому ваша функция __init__ никогда не вернется.

Вместо этого смотрит на функцию client.start_loop().

person hardillb    schedule 17.09.2019