2014-10-09 4 views
2

정기적으로 수신되는 UDP 패킷을 통해 제공된 데이터를 표시하는 웹 앱을 만들어야합니다. 이 사이트는 Flask (피라미드 일 가능성이 있음)에있을 것이며 Nginx에 배포 될 것입니다. 어떻게하면 들어오는 패킷을 수신하고 데이터를 전역 적으로 액세스 가능한 목록에 넣을 수있는 매우 간단한 백그라운드 작업 (기본적으로 socket.recv())을 만들 수 있습니까?단순 네트워크 UDP 플라스크 또는 피라미드 수신

메인()에서 스레드를 생성하기 만하면됩니까? 아니면 셀러리 또는 PyRes와 같은 것을 사용해야합니까?

어떤 안내해 주셔서 감사합니다.

답변

4

셀러리를 사용해야하지만 운이 좋은 이유는 There's already a flask extension that integrates celery입니다. pip install flask, pip install flask-celery, pip install redis이어야하며 시스템에 redis 서버가 필요합니다.

import socket, select, Queue 

from flask import Flask 
from celery import Celery 


def make_celery(app): 
    celery = Celery(app.import_name, broker=app.config['CELERY_BROKER_URL']) 
    celery.conf.update(app.config) 
    TaskBase = celery.Task 
    class ContextTask(TaskBase): 
     abstract = True 
     def __call__(self, *args, **kwargs): 
      with app.app_context(): 
       return TaskBase.__call__(self, *args, **kwargs) 
    celery.Task = ContextTask 
    return celery 

app = Flask(__name__) 
app.config.update(
    CELERY_BROKER_URL='redis://localhost:6379', 
    CELERY_RESULT_BACKEND='redis://localhost:6379' 
) 
celery = make_celery(app) 
socket_queue = Queue.Queue() 


@celery.task() 
def listen_to_udp(): 
    """ 
    This code was taken from 
    https://stackoverflow.com/questions/9969259/python-raw-socket-listening-for-udp-packets-only-half-of-the-packets-received 
    """ 
    s1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    s1.bind(('0.0.0.0', 1337)) 
    s2 = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP) 
    s2.bind(('0.0.0.0', 1337)) 
    while True: 
     r, w, x = select.select([s1, s2], [], []) 
     for i in r: 
      socket_queue.put((i, i.recvfrom(131072))) 

@app.route("/") 
def test_home(): 
    listen_to_udp.delay() 
    print(socket_queue.get()) 

if __name__ == "__main__": 
    #run install.py to install dependencies and create the database 
    app.run(host="0.0.0.0", port=5000, debug=True) 
+0

감사합니다. 좋은 정보. –