【问题标题】:Weird behaviour using FLASK socketIO in python with the library eventlet在 python 中使用带有库 eventlet 的 FLASK socketIO 的奇怪行为
【发布时间】:2016-07-27 13:24:05
【问题描述】:

我正在尝试通过按下前端 HTML 上的按钮与我的后端 (Python 2.7 FLASK) 进行交互。

这是我期望的行为:

我的状态机处于等待状态(等待用户操作)

startEvent.wait()

当我按下 START 按钮时,我在后端设置了一个事件

@GUI.route('/ptu1', methods=['GET', 'POST'])
def startButton():
    if request.method == 'POST':
        startEvent.set()
        return redirect(url_for('index'))

然后我用这样的 socketIO 在我的 html 页面上发送一条消息

    socket_gui.emit('socket_field',
                     {'data': msg, 'count': self.count,'flag': 1},
                     namespace='/test')

收到此消息的javascript代码是:

socket.on('socket_field', function(msg) {

            $('#Status').text(msg.data);

            if (msg.flag == '1'){

                //do things
            }
            if (msg.flag == '2'){

                //do others things
            }

        });

目前,此代码有效,因为当我按下开始按钮时,它会发送事件,然后将套接字发送到执行我想要的操作的前端 javascript。

然后我进入等待模式(等待用户按下第二个按钮)

printEvent.wait()
socket_gui.emit('socket_field',
                     {'data': msg, 'count': self.count,'flag': 2},
                     namespace='/test')

我在点击按钮时设置事件:

@GUI.route('/print1', methods=['GET', 'POST'])
def printButton():
    if request.method == 'POST':
        printEvent.set()
        return redirect(url_for('index'))

这是问题所在:开始按钮的第一步完美运行,发出套接字并且 javascript 接收它并按我想要的方式处理它。

但是当我按下打印按钮时,我可以在我的日志中看到套接字使用正确的 args 正确发出,但前端的 javascript 从未收到它。

似乎等待事件阻塞了发射套接字。

事实上,我尝试在等待之前使用套接字发送一条消息并且它正在工作。

我认为问题出在我使用的库中:evenlet 我尝试了一个 gevent 库,它可以工作,但速度不是那么快。 我想使用 eventlet 库,但我不知道如何解决我的问题。

【问题讨论】:

    标签: javascript python sockets flask


    【解决方案1】:

    好的,我找到了解决办法:

    事实上,python 中时间库的睡眠通过 GUI 阻塞了我的套接字。为了解决这个问题,我不得不像这样使用 eventlet 库中的 sleep 函数:

    import sleep from eventlet
    

    【讨论】:

      猜你喜欢
      • 2021-07-24
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      相关资源
      最近更新 更多