2016-07-27 77 views
0

我想通過按我的前端HTML上的按鈕來與我的後端(Python 2.7 FLASK)交互。在庫中使用FLASK socketIO的奇怪行爲庫eventlet

這裏的行爲我想到:

我的狀態機處於等待狀態(等待用戶操作)

startEvent.wait()

當我按下按鈕開始,我在我的後面設置一個事件最終

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

然後我在我的html頁面上發送消息與socketIO這樣

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接收它並將其視爲我想要的。

但是當我按下打印按鈕時,我可以在我的日誌中看到,套接字正確地使用了良好的參數,但前端的JavaScript從未收到它。

看來,等待事件阻止發射套接字。

事實上,我試圖在等待之前發送帶有套接字的消息並且它正在工作。

我認爲這個問題出現在我使用的庫中:evenlet 我嘗試了一個gevent庫,但它工作起來,但速度並不快。 我想使用eventlet庫,但我不知道如何解決我的問題。

回答

0

好吧,我找到了解決辦法:

事實上,從時間庫在Python睡眠擋住我的插座throught的GUI。爲了解決這個問題,我必須使用像這樣的eventlet庫中的睡眠功能:

import sleep from eventlet