私は、Webプロジェクトをphpとpythonスクリプトを使ってフォルダを修正しています。 私は、例えば、ウェブサイト上でいくつかのjavascriptを実行したいと思います。 pythonスクリプトでフォルダを作成します。サーバの作成後にPython SocketIOイベントが発生する
私の考えは、python socketioで作業することでした。私は、基本的な接続通知が働いていて、ウェブサイト上のjsからも放出されています。
問題は、イベントレットサーバーの起動後にイベントを発行できないことです。 非同期モードを設定しようとしましたが、目的の結果がありません。ここで
は、これまでの私のコードです:
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:そのようなスレッドを使用するに問題があります( または:
私は、次のコードのようにスレッドを使用して開始しました?別のより良いアプローチ?)
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
今問題は01ですがメッセージを送信しますが、ブラウザは20〜30秒ごとにそれをキャッチし、欠落しているすべてのイベントが処理されます。デベロッパーコンソールのフレームの画像を参照してください。私は私が目指していた目標に到達するためになさ@Miguelのコメントで
わかりません。サーバーを起動した直後にコードを実行しようとしていますか?これで、どのように動作するのか、サーバー作成呼び出しは返されません。 – Miguel
@Miguelはい、私がやろうとしていたことです。スレッドを使用して新しいコードで質問を更新しました - そのようなスレッドを使用するのは正しいですか?そして、新しい出来事がなぜすぐに取り上げられるのか知っていますか? – rambii
サーバーをバックグラウンドスレッドに置く必要はありません。メインスレッドでサーバーを起動する前に、ワーカースレッドを開始するだけです。それ以外に、私が考えることができるのは 'time.sleep()'の代わりに 'gevent.sleep()'を使うべきだということです。 – Miguel