一次只有一个用户可以使用龙卷风连接到websocket服务器

时间:2017-10-27 16:12:14

标签: python websocket tornado

我正在尝试使用Python和龙卷风开发websocket服务器。这个websocket服务器将一个大型数据库结果流式传输到客户端进行一些可视化。

我面临的问题是,在长进程(import time import random import json import datetime import os import sys import cx_Oracle import string import re import subprocess import asyncio from tornado import websocket, web, ioloop, escape from datetime import timedelta from random import randint from pprint import pprint from tornado.web import RequestHandler os.environ['ORACLE_HOME'] = 'pathToOracleHome' os.environ['LD_LIBRARY_PATH'] = "$ORACLE_HOME/lib" def is_hex(a): printable = set(string.printable) - set("\x0b\x0c") return any(c not in printable for c in a) def json_print(d): print(json.dumps(d, indent=4)) def printf (format,*args): sys.stdout.write (format % args) def db(database_name='localhost/database'): return cx_Oracle.connect('user', 'pwd', database_name) def query_db(query, args=(), one=False): cur = db().cursor() cur.arraysize = 1500 cur.execute(query, args) return cur class SummaryWebSocketHandler(websocket.WebSocketHandler): clients = [] def check_origin(self, origin): return True def on_message(self, message): print ('message received') def closeDbConn(self,cur): cur.connection.close() def query(self, sql): cursor = query_db(sql) self.send_data(cursor) ### THIS IS THE LONG PROCESS ### def send_data(self, cur): results = {} columns = [column[0] for column in cur.description] total = 0 while True: Res = [] rows = cur.fetchmany() if rows == []: print('no more rows') break; for row in rows: results = {} for i, value in enumerate(row): if value == None: value = '-' results[cur.description[i][0]] = value Res.append(results) self.write_message(json.dumps(Res)) total = total + len(rows) print('total rows send', total) self.write_message("finished sending all data") self.on_close(cur) def open(self, table): print ('Connection established. \n') print ('Query string '+table+'\n') p = re.compile(r'fields=') m = p.match(table) matches = table.split("&") print (matches) param_string = '' params = [] if matches: for m in matches: print('m', m); param = '' items = m.split('=') if items[1] != '': param = '--'+items[0]+' '+items[1] params.append(param) param_string = " ".join(params) script = "php getStmt.php "+param_string print (script) proc = subprocess.Popen(script, shell=True,stdout=subprocess.PIPE) sql = proc.stdout.read() print (sql) self.query(sql) def on_close(self, cursor): print ('Connection closed.') cursor.close() settings = {'auto_reload': True, 'debug': True} if __name__ == "__main__": print ("Starting websocket server program. Awaiting client requests to open websocket ...") application = web.Application([(r"/\/table\/(.*)",SummaryWebSocketHandler), ] ,**settings) application.listen(3001) ioloop.IOLoop.instance().start() )完成之前,没有客户端可以连接。就好像一次只能连接一个客户端。

websocket是否已经是异步进程,还是我应该实现异步进程?

以下是我的代码:

Format()

0 个答案:

没有答案