首页 文章

我应该在相同的端口上运行普通的烧瓶应用程序和套接字吗?

提问于
浏览
-1

我通过gunicorn,eventlet和nginx运行模块index.py作为烧瓶应用程序 .

代码工作正常,但我无法让它运行所需的时间 .

这是代码:

from __future__ import print_function
import ast
from collections import defaultdict
import csv
import datetime
from itertools import chain
import json
import os
import operator
import sys
import time
import pymongo
from pymongo import MongoClient
from flask import Flask, render_template, redirect, url_for, request
from flask_cors import CORS
from flask_socketio import SocketIO, emit

async_mode = None

app = Flask(__name__)
app.secret_key = os.urandom(24)
socketio = SocketIO(app)
CORS(app)

sys.path.insert(0, '/home/aviral/dev/bubble-process-watson')
from entity_dict import entity_dict_CRO, entity_dict_DEN, entity_dict_url_CRO, entity_dict_url_DEN

entityDict = defaultdict(list)
for k, v in chain(entity_dict_url_CRO.items(), entity_dict_url_DEN.items()):
    entityDict[k].append(v)

try:
    client = MongoClient('localhost', 27017)
    db = client["Bubble"]
except Exception as e:
    print(e)

start_match = datetime.datetime.strptime(
    "2018-07-01 18:00:00", '%Y-%m-%d %H:%M:%S')

collection = "CRODEN_R16"

@app.route("/")
def helloFromBubble():
    return "Hey from Bubble!"

@app.route("/start_match")
def set_start_match():
    startToday = datetime.datetime.utcnow()
    file = open("set_start_match.txt", "w")
    file.write(str(startToday))
    file.close()
    return(json.dumps(startToday, default=str))

@app.route("/list-entities")
def list_entities():
    currDict = {}
    for i in entityDict:
        names = i.split("_")
        entity_name = names[0] + names[1]
        currDict[i] = {}
        currDict[i]["name"] = entity_name
        currDict[i]["image_url"] = entityDict[i][-1]
    return(json.dumps(currDict, default=str))


@socketio.on('entities')
def entity_tweets(entity_name):
    print(entity_name)
    file = open("set_start_match.txt", "r")
    for line in file:
        start_today = datetime.datetime.strptime(
            line.split('.')[0], '%Y-%m-%d %H:%M:%S')
    print(start_today)
    while True:
        now = datetime.datetime.utcnow()
        diff = now - start_today
        request_match = start_match + diff
        for post in db[collection].find():
        print(post)
            if "emotion" not in post.keys():
                continue
            if post["timeStamp"] > request_match:
                if post["entity_name"] == entity_name:
                    app.logger.info("Satisfied")
                    currDict = {}
                    currDict["entity"] = post["entity_name"]
                    currDict["emotion"] = max(
                        post["emotion"].items(), key=operator.itemgetter(1))[0]
                    currDict["profile_image"] = post["userProfile"]
                    currDict["tweet"] = post["tweet"].encode('utf-8')
                    currDict_json = json.dumps(currDict, default=str)
                    emit('Entity_Tweet', {'data':currDict_json})
                    del currDict
                    del currDict_json
                else:
            emit('Entity_Tweet', {'data':'ignored.'})
                    #print("Ignored.")
                    #app.logger.info("Ignored")
    return "Completed."

if(__name__ == "__main__"):
    socketio.run(app, host='0.0.0.0', debug=False)

这段代码工作正常,但过了一段时间后,它只是停止了一条消息:

[2018-07-04 13:06:11 0000] [3469] [关键]工作者超时(pid:3475)消息处理程序错误跟踪(最近一次调用最后一次):文件“/usr/local/lib/python2.7 /dist-packages/engineio/server.py“,第411行,在_trigger_event中返回self.handlersevent文件”/usr/local/lib/python2.7/dist-packages/socketio/server.py“,第522行,在_handle_eio_message中self._handle_event(sid,pkt.namespace,pkt.id,pkt.data)文件“/usr/local/lib/python2.7/dist-packages/socketio/server.py”,第458行,位于_handle_event self._handle_event_internal (self,sid,data,namespace,id)文件“/usr/local/lib/python2.7/dist-packages/socketio/server.py”,第461行,在_handle_event_internal中r = server._trigger_event(data [0] ,namespace,sid,* data [1:])文件“/usr/local/lib/python2.7/dist-packages/socketio/server.py”,第490行,在_trigger_event中返回self.handlers [namespace]事件文件“/usr/local/lib/python2.7/dist-packages/flask_socketio/init.py”,第251行,在_handler * args)文件“/usr/local/lib/python2.7/dist-packages/f lask_socketio / init.py“,第634行,在_handle_event ret = handler(* args)文件”/home/aviral/dev/bubble-api/index.py“,第80行,在entity_tweets中打印(发布)文件”/ usr /local/lib/python2.7/dist-packages/gunicorn/workers/base.py“,第196行,在handle_abort中sys.exit(1)SystemExit:1 [2018-07-04 13:06:42 0000] [ 3475] [INFO] Worker 退出(pid:3475)[2018-07-04 13:06:42 0000] [3487] [INFO]用pid引导 Worker :3487 [2018-07-04 13:07:55 0000] [3487] [错误]套接字错误处理请求 . 回溯(最近一次调用最后一次):文件“/usr/local/lib/python2.7/dist-packages/gunicorn/workers/async.py”,第66行,句柄six.reraise(* sys.exc_info())文件“/usr/local/lib/python2.7/dist-packages/gunicorn/workers/async.py”,第56行,句柄self.handle_request(listener_name,req,client,addr)文件“/ usr / local / lib / python2.7 / dist-packages / gunicorn / workers / async.py“,第129行,在handle_request six.reraise(* sys.exc_info())文件”/usr/local/lib/python2.7/dist- packages / gunicorn / workers / async.py“,第107行,在handle_request中respiter = self.wsgi(environ,resp.start_response)文件”/usr/local/lib/python2.7/dist-packages/flask/app.py “,第2309行,在调用返回self.wsgi_app(environ,start_response)文件”/usr/local/lib/python2.7/dist-packages/flask_socketio/init.py“,第43行,在调用start_response中)文件”/ usr / local / lib / python2.7 / dist-packages / engineio / middleware.py“,第47行,在调用返回self.engineio_app.handle_request(environ,start_response)文件”/usr/local/lib/python2.7/ dist- packages / socketio / server.py“,第360行,在handle_request中返回self.eio.handle_request(environ,start_response)文件”/usr/local/lib/python2.7/dist-packages/engineio/server.py“,行275,在handle_request environ,start_response)文件“/usr/local/lib/python2.7/dist-packages/engineio/socket.py”,第91行,在handle_get_request start_response中)文件“/ usr / local / lib / python2 . 7 / dist-packages / engineio / socket.py“,第133行,在_upgrade_websocket中返回ws(environ,start_response)文件”/usr/local/lib/python2.7/dist-packages/engineio/async_eventlet.py“,line 19,在调用return super(WebSocketWSGI,self).call(environ,start_response)文件“/usr/local/lib/python2.7/dist-packages/eventlet/websocket.py”,第129行,调用self.handler (ws)文件“/usr/local/lib/python2.7/dist-packages/engineio/socket.py”,第158行,在_websocket_handler pkt = ws.wait()文件“/ usr / local / lib / python2 . 7 / dist-packages / eventlet / websocket.py“,第787行,在self.iterator中等待我:文件”/usr/local/lib/python2.7/dist-p ackages / eventlet / websocket.py“,第642行,在_iter_frames message = self._recv_frame(message = fragmented_message)文件”/usr/local/lib/python2.7/dist-packages/eventlet/websocket.py“,第668行,在_recv_frame header = recv(2)文件“/usr/local/lib/python2.7/dist-packages/eventlet/websocket.py”,第577行,在_get_bytes中d = self.socket.recv(numbytes - len(数据))文件“/usr/local/lib/python2.7/dist-packages/eventlet/greenio/base.py”,第363行,在recv中返回self._recv_loop(self.fd.recv,b'',bufsize ,flags)文件“/usr/local/lib/python2.7/dist-packages/eventlet/greenio/base.py”,第357行,位于_recv_loop self._read_trampoline()文件“/ usr / local / lib / python2 . 7 / dist-packages / eventlet / greenio / base.py“,第328行,在_read_trampoline中timeout_exc = socket_timeout('timed out'))文件”/usr/local/lib/python2.7/dist-packages/eventlet/greenio /base.py“,第207行,在_trampoline中mark_as_closed = self._mark_as_closed)文件”/usr/local/lib/python2.7/dist-packages/eventlet/hubs/init.py“,第163行,在蹦床中转动hub.switch()文件“/usr/local/lib/python2.7/dist-packages/eventlet/hubs/hub.py”,第295行,在开关中返回self.greenlet.switch()超时:超时[ 2018年7月4日13:08:58 0000] [3487] [错误]套接字错误处理请求 . 回溯(最近一次调用最后一次):文件“/usr/local/lib/python2.7/dist-packages/gunicorn/workers/async.py”,第66行,句柄six.reraise(* sys.exc_info())文件“/usr/local/lib/python2.7/dist-packages/gunicorn/workers/async.py”,第56行,句柄self.handle_request(listener_name,req,client,addr)文件“/ usr / local / lib / python2.7 / dist-packages / gunicorn / workers / async.py“,第129行,在handle_request six.reraise(* sys.exc_info())文件”/usr/local/lib/python2.7/dist- packages / gunicorn / workers / async.py“,第107行,在handle_request中respiter = self.wsgi(environ,resp.start_response)文件”/usr/local/lib/python2.7/dist-packages/flask/app.py “,第2309行,在调用返回self.wsgi_app(environ,start_response)文件”/usr/local/lib/python2.7/dist-packages/flask_socketio/init.py“,第43行,在调用start_response中)文件”/ usr / local / lib / python2.7 / dist-packages / engineio / middleware.py“,第47行,在调用返回self.engineio_app.handle_request(environ,start_response)文件”/usr/local/lib/python2.7/ dist- packages / socketio / server.py“,第360行,在handle_request中返回self.eio.handle_request(environ,start_response)文件”/usr/local/lib/python2.7/dist-packages/engineio/server.py“,行275,在handle_request environ,start_response)文件“/usr/local/lib/python2.7/dist-packages/engineio/socket.py”,第91行,在handle_get_request start_response中)文件“/ usr / local / lib / python2 . 7 / dist-packages / engineio / socket.py“,第133行,在_upgrade_websocket中返回ws(environ,start_response)文件”/usr/local/lib/python2.7/dist-packages/engineio/async_eventlet.py“,line 19,在调用return super(WebSocketWSGI,self).call(environ,start_response)文件“/usr/local/lib/python2.7/dist-packages/eventlet/websocket.py”,第129行,调用self.handler (ws)文件“/usr/local/lib/python2.7/dist-packages/engineio/socket.py”,第158行,在_websocket_handler pkt = ws.wait()文件“/ usr / local / lib / python2 . 7 / dist-packages / eventlet / websocket.py“,第787行,在self.iterator中等待我:文件”/usr/local/lib/python2.7/dist-p ackages / eventlet / websocket.py“,第642行,在_iter_frames message = self._recv_frame(message = fragmented_message)文件”/usr/local/lib/python2.7/dist-packages/eventlet/websocket.py“,第668行,在_recv_frame header = recv(2)文件“/usr/local/lib/python2.7/dist-packages/eventlet/websocket.py”,第577行,在_get_bytes中d = self.socket.recv(numbytes - len(数据))文件“/usr/local/lib/python2.7/dist-packages/eventlet/greenio/base.py”,第363行,在recv中返回self._recv_loop(self.fd.recv,b'',bufsize ,flags)文件“/usr/local/lib/python2.7/dist-packages/eventlet/greenio/base.py”,第357行,位于_recv_loop self._read_trampoline()文件“/ usr / local / lib / python2 . 7 / dist-packages / eventlet / greenio / base.py“,第328行,在_read_trampoline中timeout_exc = socket_timeout('timed out'))文件”/usr/local/lib/python2.7/dist-packages/eventlet/greenio /base.py“,第207行,在_trampoline中mark_as_closed = self._mark_as_closed)文件”/usr/local/lib/python2.7/dist-packages/eventlet/hubs/init.py“,第163行,在蹦床中转动hub.switch()文件“/usr/local/lib/python2.7/dist-packages/eventlet/hubs/hub.py”,第295行,在开关中返回self.greenlet.switch()超时:超时

我正在运行应用程序:

gunicorn --worker-class eventlet -w 1 --bind 0.0.0.0:5000 index:app

1 回答

  • 2

    while True: 永远阻止了这个 Worker ,所以 Worker 达到它的超时并失败了 . 尽量避免 endpoints (Flask或SocketIO)方法中的那种无限循环 .

相关问题