Javascript 创建服务器后发出Python SocketIO事件

Javascript 创建服务器后发出Python SocketIO事件,javascript,python,socket.io,eventlet,flask-socketio,Javascript,Python,Socket.io,Eventlet,Flask Socketio,我有一个使用php和修改文件夹的python脚本的web项目。 我想在网站上执行一些javascript,比如在python脚本中创建文件夹 我的想法是使用python socketio。我有基本的连接通知工作,从一个网站上的js发出的信息也由js处理 问题是,启动eventlet服务器后,我无法发出任何事件。 我尝试设置异步模式,但没有达到预期的效果 以下是我目前的代码: import socketio from flask import Flask, render_template impo

我有一个使用php和修改文件夹的python脚本的web项目。 我想在网站上执行一些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

更新:

我开始使用如下代码中的线程: (使用这样的线程有问题吗?还是其他更好的方法?)

现在的问题是,
sio.emit('mes','foo'+str(count))
发出消息,但浏览器仅每隔20~30秒捕获一次,然后处理所有丢失的事件。从dev控制台查看带有框架的图片


通过@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()

我不太明白。您是否正在尝试在服务器启动后在底部运行代码?这就是现在的工作方式,服务器创建调用不会返回。@Miguel是的,这就是我试图做的。我用使用线程的新代码更新了我的问题-这样使用线程对吗?你知道为什么新事件没有被立即接收吗?你真的不需要把服务器放在后台线程中。在主线程上启动服务器之前,只需启动工作线程。除此之外,我所能想到的就是你应该使用
gevent.sleep()
,而不是
time.sleep()
。将问题分解成一个代码和一个问题,以得到明确的答案。否则,对于当前方法:删除eventlet或gevent。两者在同一过程中都是自找麻烦。在执行任何其他导入之前,在最开始添加
eventlet/gevent.monkey\u patch()
。@Miguel没有将服务器放在单独的线程中似乎解决了我的问题。谢谢你的评论和帮助。但是
gevent.sleept()
似乎与
time.sleep()
没有相同的效果-工作人员不再输出任何内容。
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()