2016-05-13 8 views
2

Ich habe ein Web-Projekt mit PHP und ein Python-Skript, das Ordner ändert. Ich möchte einige Javascript auf der Website basierend auf z. Eine Ordnererstellung erfolgt im Python-Skript.Python SocketIO Emitting-Ereignis nach der Server-Erstellung

Meine Idee war es, mit Python socketio zu arbeiten. Ich habe die grundlegende Verbindung Benachrichtigung arbeiten und emittiert von der js auf einer Website werden von der js ebenso gehandhabt.

Das Problem ist, dass ich keine Ereignisse nach dem Starten des Eventlet-Servers ausgeben kann. Ich habe versucht, den Async-Modus einzurichten, aber es hat nicht das gewünschte Ergebnis.

mein Code Hier ist so weit:

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 

UPDATE:

ich Themen wie in dem folgenden Code: (Gibt es ein Problem mit einem Gewinde wie die Verwendung von Or ein weiterer besserer Ansatz?)

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 

Das Problem ist jetzt, dass die sio.emit('mes', 'foo ' + str(count)) sendet die Nachricht - aber der Browser fängt nur alle 20 ~ 30s ab und dann werden alle fehlenden Ereignisse behandelt. Siehe das Bild mit den Frames von der Dev-Konsole.

network frames

+0

Nicht sicher, dass ich verstehe. Versuchen Sie, Code direkt nach dem Start des Servers unten zu starten? Das funktioniert jetzt so, dass der Server-Erstellungsaufruf nicht zurückkehrt. – Miguel

+0

@ Miguel Ja das ist, was ich versucht habe zu tun. Ich habe meine Frage mit meinem neuen Code über Threads aktualisiert - ist es richtig, solche Threads zu verwenden? Und wissen Sie, warum die neuen Veranstaltungen nicht sofort aufgenommen werden? – rambii

+0

Sie müssen den Server nicht wirklich in einen Hintergrundthread einfügen. Starten Sie einfach den Worker-Thread, bevor Sie den Server im Hauptthread starten. Abgesehen davon kann ich nur daran denken, dass Sie 'gevent.sleep()' anstelle von 'time.sleep()' verwenden sollten. – Miguel

Antwort

2

mit den Kommentaren von @Miguel erreichte ich Ziel zu erreichen, ich strebe.

Ich entfernte den Thread für den Server, der den gewünschten Effekt zu haben schien. Jetzt zeigt die Entwicklerkonsole jedes Mal ein emittiertes Ereignis an, wenn der Mitarbeiter ein Ereignis auslöst.

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() 
Verwandte Themen