2016-05-19 10 views
0

私はリアルタイムでデータベースにプッシュされた読み取り値を更新するWebアプリケーションを作成していますので、ユーザーが取得するたびにメソッドをバックグラウンドで実行する必要がありますページ。データはユーザー固有のものなので、バックグラウンドスレッドを追加するだけでは役に立ちません。しかし、難しい部分は、私はボタンプレス上でスレッドを止めることができなければならないということです。そして、別のデータを使ってすぐにそれをやり直してください。私はこのように少し見えeventlet gunicorn、フラスコ-socketioでソリューションを作成しようとした:flask-socketioとeventletを使用して各ユーザーに固有のデータを更新する

@socketio.on('update', namespace='/update') 
    def make_thread(*args): 
     thread = Thread(target=update(args) 
     thread.daemon = True 
     thread.start() 

def update(*args): 
     while True: 
      //code that keeps running to query changes 
      socket.emit('update_reading', reading) 
      time.sleep(10) 

私の問題は、コードが動作し、それがフロントエンドを更新しない間、私があるように見えることができないということです特定のユーザーのためにこのスレッドを作成する方法を正確に把握することができます(必要な場合)。そして、別のソケットメソッドからスレッドを停止し、その代わりに新しいスレッドメソッドを開始する方法。

+0

あなたはそのユーザーを特定する方法がありますか?たとえば、セッションにユーザー名またはIDがありますか? – Miguel

+0

'thread = Thread(...)'の前にスレッドを作成する必要性を検証しますか? – temoto

+0

@Miguel私はユーザーを識別するために使用するセッション内のユーザーIDを持っています。これは、私が使用しているmongodbバックエンドからのObjectIDです。 –

答えて

0

イベントconnectを取得した場合、データベースユーザーIDをSocketIOセッションIDにマップできます。このような何か:その時から

socketio.on('connect') 
def on_connect(): 
    user = load_user(session['user_id']) 
    user.sid = request.sid # socketio session id 
    save_user(user) 

socketio.on('disconnect') 
def on_disconnect(): 
    user = load_user(session['user_id']) 
    user.sid = None 
    save_user(user) 

、あなたは、個々のユーザーに発するだけで、あなたのEMITコールにroom=user.sidを追加したいです。例:

@socketio.on('update', namespace='/update') 
def make_thread(*args): 
    user = load_user(session['user_id']) 
    thread = Thread(target=update, args=(user.sid,)) 
    thread.daemon = True 
    thread.start() 

def update(sid): 
    while True: 
     //code that keeps running to query changes 
     socket.emit('update_reading', reading, room=sid) 
     time.sleep(10) 

バックグラウンドスレッドを停止するには、すべてのスレッドを追跡し、各スレッドがどのユーザーに属しているかを把握する必要があります。スレッドループでは、while Trueの代わりにブール値を持つ必要があります。そうすれば、そのブール値を切り替えることによってスレッドが停止するように指示できます。スレッドのクラスラッパーを作成し、ブール値が変更されたstop()メソッドを追加し、thread.join()を呼び出してスレッドが終了するまで待つことをお勧めします。

+0

私はこれをして、それは完璧に動作するようです、助けと素敵な答えのおかげで。将来不思議に思う人のために、私は[link](http://stackoverflow.com/questions/27102881/python-threading-self-stop-event-object-is-not-callable)の答えに従ってストップ可能なスレッドを作成しました。 ) 'この質問。今のところ印をつけて、感謝します。 –

関連する問題