Python 服务器创建后 SocketIO 发出事件
Python SocketIO emitting event after server creation
我有一个使用 php 和 python 修改文件夹的脚本的网络项目。
我想在基于 eg 的网站上执行一些 javascript。在 python 脚本中创建文件夹。
我的想法是使用 python socketio。我有基本的连接通知工作,并且从网站上的 js 发出也由 js 处理。
问题是在启动 eventlet 服务器后我无法发出任何事件。
我尝试设置异步模式,但没有得到想要的结果。
到目前为止,这是我的代码:
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
更新:
我开始像下面的代码一样使用线程:
(这样使用线程有问题吗?或者其他更好的方法?)
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
现在的问题是 sio.emit('mes', 'foo ' + str(count))
发出消息 - 但浏览器仅每 20~30 秒捕获一次,然后处理所有丢失的事件。从开发控制台查看带有框架的图片。
通过@Miguel 的评论,我实现了我的目标。
我删除了似乎达到预期效果的服务器线程。现在,每当工作人员触发一个事件时,开发人员控制台都会显示一个发出的事件。
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()
我有一个使用 php 和 python 修改文件夹的脚本的网络项目。 我想在基于 eg 的网站上执行一些 javascript。在 python 脚本中创建文件夹。
我的想法是使用 python socketio。我有基本的连接通知工作,并且从网站上的 js 发出也由 js 处理。
问题是在启动 eventlet 服务器后我无法发出任何事件。 我尝试设置异步模式,但没有得到想要的结果。
到目前为止,这是我的代码:
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
更新:
我开始像下面的代码一样使用线程: (这样使用线程有问题吗?或者其他更好的方法?)
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
现在的问题是 sio.emit('mes', 'foo ' + str(count))
发出消息 - 但浏览器仅每 20~30 秒捕获一次,然后处理所有丢失的事件。从开发控制台查看带有框架的图片。
通过@Miguel 的评论,我实现了我的目标。
我删除了似乎达到预期效果的服务器线程。现在,每当工作人员触发一个事件时,开发人员控制台都会显示一个发出的事件。
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()