我需要创build一个Web应用程序,显示通过定期传入的UDP数据包提供的数据。 该网站可能会在Flask(可能是金字塔),部署在Nginx下。 我怎么能创build一个非常简单的后台任务(基本上只是socket.recv())来监听任何传入的数据包,并将数据推送到全局可访问列表?
我可以简单地从main()产生一个线程来做到这一点,或者我需要使用像芹菜或PyRes?
感谢您的任何指导。
你将不得不使用芹菜,但你很幸运,因为已经有一个集成了芹菜瓶扩展 。 你必须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)