Отключение колбы после работы 10-15 сек - PullRequest
0 голосов
/ 18 мая 2018

Я разрабатываю бота Python Messenger, используя оболочку из pymessenger .Это работает локально, но в производстве оно ломается. Как и в каждую секунду, есть 15-20 требований.Я использую Pm2 для перезапуска процесса при выключении / закрытии.Когда я запускаю приложение, оно запускается в течение 10-20 секунд, работает как положено, но внезапно показывает эту ошибку и перезапускается.Буду очень признателен, если кто-нибудь сможет мне помочь.

Вот код:

# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')

import os
import emoji
from flask import Flask, request
from pymessenger.bot import Bot    
app = Flask(__name__)

bot = Bot(ACCESS_TOKEN)


@app.route("/webhook", methods=['GET', 'POST'])
def hello():
    if request.method == 'GET':
        if request.args.get("hub.verify_token") == VERIFY_TOKEN:
            return request.args.get("hub.challenge")
        else:
            return 'Invalid verification token'
    try:
        if request.method == 'POST':
            output = request.get_json()
            for event in output['entry']:
                if event.get("messaging"):
                    messaging = event['messaging']
                    for x in messaging:
                        if x.get('message'):
                            recipient_id = x['sender']['id']
                            if x['message'].get('text'):
                                message = emoji.demojize(x['message']['text'])


#-----------------------some other code ------------------
#-------------------------------------------------------
                                bot.send_text_message(
                                    recipient_id, "replay")
                            if x['message'].get('attachments'):
                                bot.send_text_message(
                                    recipient_id, "No result!!")
                        else:
                            pass
                return "Success"
        return "Success"
    except IOError as (errno, strerror):
        print "I/O error({0}): {1}".format(errno, strerror)
    except ValueError:
        print "Could not convert data to an integer."
    except:
        print "Unexpected error:", sys.exc_info()[0]
        raise

    if __name__ == "__main__":
       app.run(port=5000, debug=False)

Я не разработчик Python, просто использую его для библиотеки, которую я не могунайти в другой платформе для мессенджера Bot.

Вот журнал ошибок:

  File "/usr/lib/python2.7/SocketServer.py", line 290, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 318, in process_request
   self.finish_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 331, in finish_request
    self.RequestHandlerClass(request, client_address, self)
   File "/usr/lib/python2.7/SocketServer.py", line 654, in __init__
     self.finish()
   File "/usr/lib/python2.7/SocketServer.py", line 713, in finish
     self.wfile.close()
   File "/usr/lib/python2.7/socket.py", line 283, in close
     self.flush()
  File "/usr/lib/python2.7/socket.py", line 307, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
 socket.error: [Errno 32] Broken pipe

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Используйте Gunicorn с Flask для управления запросами WSGI.Вот небольшие скрипты, которые могут помочь вам запустить и остановить Flask Server, работающий с Gunicorn.Встроенный сервер Flask не предназначен для использования в производстве.Он падает со временем.Поэтому загляните в Gunicorn:

Стартовый скрипт:

#!/bin/bash
stat=0
COUNTER=0
swait()
{
        echo -ne "Waiting for service to start"
                until [[ $stat -ge 1 ]]
                do
        stat=$(netstat -lnt | awk '$4 ~ /:5001$/' |wc -l)
                        COUNTER=$((COUNTER+1))
                        if [ $COUNTER == 5 ] ; then
                                echo -e '\nError-Service start failed'
                                exit;
                         fi
                        echo -ne "."
                        sleep 2 
                    done
}
service_start()
{
        echo "Starting Service"

        /<project_path>/venv/bin/gunicorn --reload -b 0.0.0.0:5001 api:app --access-logfile=/var/log/<project_name>.log --error-logfile=/var/log/<project_name>_error.log -D -w 2 --access-logformat='%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" %(L)s' --log-level=info

}
service_start
swait

echo -e "\nService started Successfully"

Стоп-скрипт

#!/bin/bash
echo "Stopping Service"
stat=1
COUNTER=0

swait()
{
        echo -ne "Waiting for service to stop"
                until [[ $stat -eq 0 ]]
                do
        stat=$(netstat -lnt | awk '$4 ~ /:5001$/' |wc -l)
                        COUNTER=$((COUNTER+1))
                        if [ $COUNTER == 8 ] ; then
                                echo -e '\nService stop failed'
                                exit;
                         fi
                        echo -ne "."
                        sleep 2 
                    done
}

service_stop()
{
        for pid in `ps augx | grep gunicorn | grep -E ':5001' | grep -v grep | awk '{print $2}'`;
        do
                echo "Killing PID" $pid
                kill $pid
        done
}

service_stop
swait


echo -e "\nService Stopped Successfully"
0 голосов
/ 18 мая 2018

Вы используете встроенный сервер, который поставляется с Flask, в производстве.Не делайте этого, это было разработано только для удобства, чтобы облегчить разработку.Он не может работать с реальными производственными пограничными системами.

То, что происходит, - то, что удаленный клиент, на который сервер отправлял ответ, рано закрыл соединение.Это происходит время от времени, не совсем так, как это должно работать, но это Интернет для вас.Это не то, о чем вам нужно заботиться при разработке приложения, поэтому встроенный сервер не справляется с этим пограничным случаем.

Вместо этого вам необходимо развернуть Flask на сервере WSGI производственного качества.Это может быть Apache с mod_wsgi, или Gunicorn, или uWSGI, или любой другой такой сервер.См. Главу Развертывание в документации Flask .

...