V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
nyaruko
V2EX  ›  Python

Flask 使用过程中的一个问题

  •  
  •   nyaruko · 2017-07-07 21:06:58 +08:00 · 2659 次点击
    这是一个创建于 2456 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近用 flask 写了一个简单的服务,大体是这样的:

    这里姑且称这个服务为 A,服务 A 启动后,监听端口 A,端口 A 在收到请求后,会调用一个脚本启动服务器上的应用 B,应用 B 会监听端口 B。

    然后,当服务 A 的进程终止后,再次启动服务 A,发现端口 A 被占用了,而占用 A 的是应用 B 的进程,而且此时想端口 A 发送正常调用业务 B 的请求也不会得到相应,必须将应用 B 杀死后才能启动服务 A。

    请问,造成这样的原因是什么。

    P.S,调用这一服务的脚本是通过 os.system 执行的。

    6 条回复    2017-07-12 18:26:06 +08:00
    messyidea
        1
    messyidea  
       2017-07-07 21:39:42 +08:00
    这应该不是 Flask 的问题了
    话说服务 B 不是监听端口 B 吗? 为什么 "占用端口 A 的是应用 B 的进程"?
    是不是 A 没有 SO_REUSEADDR 造成的?
    Kilerd
        2
    Kilerd  
       2017-07-07 21:45:47 +08:00
    Flask: 这个锅我不想背。
    realityone
        3
    realityone  
       2017-07-07 22:05:22 +08:00 via iPhone
    启动 B 的时候不要继承 A 的 fd
    billlee
        4
    billlee  
       2017-07-07 22:16:02 +08:00
    用 subprocess.Popen, 指定 close_fds=True
    Lax
        5
    Lax  
       2017-07-07 23:07:54 +08:00
    A 用的哪个端口号,看看在不在 ip_local_port_range 范围内。
    sysctl net.ipv4.ip_local_port_range

    B 应该还有向外的网络连接,可能用到上述的端口段,如果 A 端口在这个范围内就可能用到。
    lolizeppelin
        6
    lolizeppelin  
       2017-07-12 18:26:06 +08:00 via Android
    close fds 正解

    或者 fork 后手动关闭 socket 的 fd

    或者 fnctl 对端口 fd 设置标记


    这些都是 python 以外的只是
    算 Linux 程序开发的基本知识
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2958 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 15:12 · PVG 23:12 · LAX 08:12 · JFK 11:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.