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.
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
@ 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
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