Нужно ли запускать обычное приложение флешки и сокеты на одних и тех же портах? - PullRequest
0 голосов
/ 04 июля 2018

Я использую модуль index.py в качестве приложения для колб через gunicorn, eventlet и nginx.

Код работает нормально, но я не могу запустить его в течение необходимого времени.

Это код:

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) Ошибка обработчика сообщений Traceback (последний последний вызов):
Файл "/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], пространство имен, 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/flask_socketio/init.py", строка 634, в _handle_event ret = handler (* args) Файл "/home/aviral/dev/bubble-api/index.py", строка 80, в entity_tweets файл печати (post) "/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] Рабочий выходит (pid: 3475) [2018-07-04 13:06:42 +0000] [3487] [INFO] Загрузка рабочего с pid: 3487 [2018-07-04 13:07:55 +0000] [3487] [ОШИБКА] Запрос обработки ошибки сокета. Traceback (самый последний последний звонок): File "/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 (environment, resp.start_response) Файл "/usr/local/lib/python2.7/dist-packages/flask/app.py", строка 2309, в звонок вернуть файл self.wsgi_app (environment, 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 (environment, start_response) Файл "/usr/local/lib/python2.7/dist-packages/socketio/server.py", строка 360, в handle_request вернуть файл self.eio.handle_request (environment, start_response) "/usr/local/lib/python2.7/dist-packages/engineio/server.py", строка 275, в handle_request environment, 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 (environment, start_response) "/usr/local/lib/python2.7/dist-packages/engineio/async_eventlet.py", линия 19, вызов возврат супер (WebSocketWSGI, self). вызов (environment, 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-packages/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 (data)) Файл "/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, в выключателе return self.greenlet.switch () timeout: timed out [2018-07-04 13:08:58 +0000] [3487] [ERROR] Запрос на обработку ошибки сокета. Traceback (последний вызов был последним): файл "/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 (environment, resp.start_response) Файл "/usr/local/lib/python2.7/dist-packages/flask/app.py", строка 2309, в вызов вернуть файл self.wsgi_app (environment, 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 (environment, start_response) Файл "/usr/local/lib/python2.7/dist-packages/socketio/server.py", строка 360, в handle_request вернуть файл self.eio.handle_request (environment, start_response) "/usr/local/lib/python2.7/dist-packages/engineio/server.py", строка 275, в handle_request environment, 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 (environment, start_response) "/usr/local/lib/python2.7/dist-packages/engineio/async_eventlet.py", линия 19, вызов вернуть супер (WebSocketWSGI, self). вызов (environment, 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-packages/eventlet/websocket.py", строка 642, в _iter_framesmessage = 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 (data)) Файл "/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 Ответ

0 голосов
/ 04 июля 2018

То, что while True: блокирует работника навсегда, поэтому работник достигает своего таймаута и терпит неудачу. Старайтесь избегать такого рода бесконечных циклов внутри метода конечной точки (Flask или SocketIO).

...