2011年8月30日火曜日

嘘つきましたorz

http://nariya-takemura.blogspot.com/2011/08/blog-post_30.html
↑のソースはうごかなかった。
プロセス新規で作られるんだけど、それじゃだめで、子プロセスがport つかいつづけてレスポンスを買えそうとし続ける。
そのため、結局ソース書き替えてもレスポンスが変わらないという事態にorz

んで書き直したソースが以下

autoreloader.py
# -*- coding: utf-8 -*-
import os
import sys
import subprocess
import time

def file_times(path):
for root, dirs, files in os.walk(path):
for file in files:
filename = os.path.join(root, file)
# print 'load,', filename
if filename[-4:] in ('.pyc', '.pyo'):
filename = filename[:-1]
yield os.stat(filename).st_mtime

def print_stdout(process):
stdout = process.stdout
if stdout != None:
print stdout

# We concatenate all of the arguments together, and treat that as the command to run
command = ' '.join(sys.argv[1:])
print command

# The path to watch
path = os.path.split(os.path.abspath(sys.argv[1]))[0]
print "path", path
# How often we check the filesystem for changes (in seconds)
wait = 1

# The process to autoreload
process = subprocess.Popen(command, shell=True)

# The current maximum file modified time under the watched directory
last_mtime = max(file_times(path))

print "auto reload start"
while True:
max_mtime = max(file_times(path))
# print "max_mtime", max_mtime
print_stdout(process)
if max_mtime > last_mtime:
last_mtime = max_mtime
print 'Restarting process.', process
# print "now :",process.poll()
try:
process.kill()
except:
#サブプロセス側でもファイルを監視して自決するため、ここでkillできない事がある.
pass
process = subprocess.Popen(command, shell=True)
time.sleep(wait)


呼び出される方のサンプル
まぁ適宜読み直してください
# -*- coding: utf-8 -*-
from time import gmtime, strftime
import os
import sys
import time
import random
from gevent import pywsgi
import gevent
from geventwebsocket.handler import WebSocketHandler
from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash
from werkzeug.debug import DebuggedApplication
from groovy.util import mylog
import Queue # thread-safe
import threading
import urllib2



# demo app

# configuration
DATABASE = '/tmp/flaskr.db'
DEBUG = True
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = 'default'


def handle(ws):
""" This is the websocket handler function. Note that we can dispatch based on path in here, too."""
if ws.path == '/echo':
while True:
m = ws.wait()
if m is None:
break
ws.send(m)

elif ws.path == '/data':
for i in xrange(10000):
ws.send("0 %s %s\n" % (i, random.random())) #ここは通信エラーが起きることがある.
print "0 %s %s\n" % (i, random.random())
gevent.sleep(0.1)

#Flash作る. Tornadoとかでもできると思われる.
#class MyApp(Flask):
# def serve_forever(self):
# self.stop_serving = False
# while not self.stop_serving:
# app.logger.debug('serve_forever???')
# self.handle_request()
# return
## self.stop()
#
# def stop (self):
# self.stop_serving = True

app = Flask(__name__)
app.debug = True
d_app = DebuggedApplication(app, True)


class CleanExit:
pass

ipq = Queue.Queue()


def file_times(path):
for root, dirs, files in os.walk(path):
for file in files:
filename = os.path.join(root, file)
# print 'load,', filename
if filename[-4:] in ('.pyc', '.pyo'):
filename = filename[:-1]
yield os.stat(filename).st_mtime


class test(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.setDaemon(True)
self.i = 0
def run(self):
path = os.path.split(os.path.abspath(sys.argv[0]))[0]
# print "path", path
print "Start."
last_mtime = max(file_times(path))
while True:
# print self.i
max_mtime = max(file_times(path))
# print "max_mtime", max_mtime
if max_mtime > last_mtime:
print "changed"
last_mtime = max_mtime
ipq.put(CleanExit)
groovy_server.stop()
# try:
# response = urllib2.urlopen("http://localhost:80/")
# except urllib2.URLError:
# print "urllib errro"
# pass
sys.exit(3)
time.sleep(0.3)
self.i += 1

t = test()
t.start()

#app.config.from_object(__name__)
#app.config.from_envvar('FLASKR_SETTINGS', silent=True)
def groovy(environ, start_response):
print "hya--a"
try:
if ipq.get_nowait() == CleanExit:
print "goodby world", groovy_server
groovy_server.stop()
sys.exit(2)
return "good bye"
# break
except Queue.Empty:
pass

path = environ["PATH_INFO"]
# mylog ("pathtt is ", path)
if path in("/", "/favicon.ico"):
# print "path is ", path
return d_app(environ, start_response)
elif path == '/test':
start_response("200 OK", [('Content-Type', 'text/plain')])
return ["blaat"]
elif path == "/data":
handle(environ['wsgi.websocket'])
else:
return d_app(environ, start_response)

app.debug = True
groovy_server = pywsgi.WSGIServer(('0.0.0.0', 80), groovy, handler_class=WebSocketHandler)

@app.route("/")
def hello():
# return "hello curuel world--------"
# return "hello sys.path", sys.path
return render_template('base.html', name="unko")

if __name__ == "__main__":
print "run_groovy"
groovy_server.serve_forever()
print "run_groovy end"

0 件のコメント: