2016-05-13 5 views
2

J'ai un projet web utilisant php et un script python qui modifie les dossiers. Je veux exécuter du javascript sur le site Web basé sur par exemple. une création de dossier effectuée dans le script python.Python SocketIO émettant un événement après la création du serveur

Mon idée était de travailler avec python socketio. J'ai la notification de connexion de base fonctionnant et émet des js sur un site Web sont manipulés par le js aussi bien.

Le problème est que je ne peux pas émettre d'événements après le démarrage du serveur d'événement. J'ai essayé de configurer le mode asynchrone mais il n'a pas le résultat souhaité.

Voici mon code à ce jour:

import socketio 
from flask import Flask, render_template 
import eventlet 

import sys 

sio = socketio.Server(async_mode='eventlet') 
app = Flask(__name__) 

@sio.on('connect') 
def connect(sid, environ): 
    print('connect ', sid) 
    sio.emit('channel', 'new connection') 
    sys.stdout.flush() 

@sio.on('mes') 
def message(sid, data): 
    print('message ', data) 
    sys.stdout.flush() 

app = socketio.Middleware(sio) 

eventlet.wsgi.server(eventlet.listen(('', 8000)), app) 

# create folder HERE and emit event which will be sent to browser 

MISE À JOUR:

j'ai commencé à l'aide de fils comme dans le code suivant: (Y at-il un problème avec l'aide de fils comme ça ou une autre meilleure approche?)

import socketio 
from flask import Flask, render_template 
import eventlet 

import sys 
import thread 
import time 

sio = socketio.Server(async_mode='gevent') 

@sio.on('connect') 
def connect(sid, environ): 
    print('connect ', sid) 
    sio.emit('channel', 'new connection') 
    sys.stdout.flush() 

@sio.on('mes') 
def message(sid, data): 
    print('message ', data) 
    sio.emit('channel', 'yeah') 
    sys.stdout.flush() 

from gevent import pywsgi 
from geventwebsocket.handler import WebSocketHandler 
app = socketio.Middleware(sio) 

def worker(threadName): 
    count = 1 
    while count > 0: 
     time.sleep(1) 
     # trying to emit message HERE 
     sio.emit('mes', 'foo ' + str(count)) 
     print "working " + str(count) 
     sys.stdout.flush() 
     count += 1 

def server(threadName): 
    print "server starting" 
    sys.stdout.flush() 
    pywsgi.WSGIServer(('', 8000), app, handler_class=WebSocketHandler).serve_forever() 

try: 
    thread.start_new_thread(worker, ("Thread-1",)) 
    thread.start_new_thread(server, ("Thread-2",)) 
except: 
    print "Error: unable to start thread" 

while 1: 
    pass 

Le problème est maintenant le sio.emit('mes', 'foo ' + str(count)) émet le message - mais le navigateur ne l'attrape que toutes les 20 ~ 30 secondes, puis tous les événements manquants sont traités. Voir l'image avec les cadres de la console de développement.

network frames

+0

Je ne suis pas certain de comprendre. Essayez-vous d'exécuter du code en bas, juste après le démarrage du serveur? C'est maintenant comment les choses fonctionnent, l'appel de création de serveur ne retourne pas. – Miguel

+0

@Miguel Oui c'est ce que j'essayais de faire. J'ai mis à jour ma question avec mon nouveau code en utilisant des threads - est-ce correct d'utiliser des threads comme ça? Et savez-vous pourquoi les nouveaux événements ne sont pas repris immédiatement? – rambii

+0

Vous n'avez pas vraiment besoin de mettre le serveur dans un thread d'arrière-plan. Il suffit de démarrer le thread de travail avant de démarrer le serveur sur le thread principal. A part ça, tout ce que je peux penser c'est que vous devriez utiliser 'gevent.sleep()' au lieu de 'time.sleep()'. – Miguel

Répondre

2

Avec les commentaires par @Miguel j'accompli pour atteindre au but que je visais.

J'ai supprimé le fil pour le serveur qui semblait avoir l'effet désiré. Maintenant, la console du développeur affiche un événement émis chaque fois que le travailleur déclenche un événement.

import socketio 
import sys 
import thread 
import time 

sio = socketio.Server(async_mode='gevent') 

@sio.on('connect') 
def connect(sid, environ): 
    print('connect ', sid) 
    sio.emit('channel', 'new connection') 
    sys.stdout.flush() 

@sio.on('mes') 
def message(sid, data): 
    print('message ', data) 
    sio.emit('channel', 'yeah') 
    sys.stdout.flush() 

from gevent import pywsgi 
from geventwebsocket.handler import WebSocketHandler 
app = socketio.Middleware(sio) 

def worker(threadName): 
    count = 1 
    while count > 0: 
     time.sleep(5) 
     sio.emit('mes', 'foo ' + str(count)) 
     print "working " + str(count) 
     sys.stdout.flush() 
     count += 1 

try: 
    thread.start_new_thread(worker, ("Thread-1",)) 
except: 
    print "Error: unable to start thread" 

print "server starting" 
sys.stdout.flush() 
pywsgi.WSGIServer(('', 8000), app, handler_class=WebSocketHandler).serve_forever()