首页 > 解决方案 > 在 UWSGI 中创建的进程未在线程模式下完成

问题描述

我正在使用带有 uwsgi(2.0.17.1)、uwsgi-plugin-python2 (2.0.17) 和 Flask (1.0.2) 的 CentOS 7。

我有一个运行许多 shell 命令的烧瓶应用程序。其中一些无限期挂起。我在下面分享其中一个作为示例,它很容易复制。我在线程模式下使用 uwsgi。

#!/usr/bin/python
from flask import Flask
import subprocess

app = Flask(__name__)

@app.route("/test/")
def test():
    print 'state 1'
    p = subprocess.Popen(['ntpdate', '-u', '0.pool.ntp.org'],close_fds=True)
    print 'state 2'
    out, err = p.communicate()
    print 'state 3'

    print 'output: {}'.format(out)
    print 'error: {}'.format(err)
    return 'finish'

uwsgi 命令:

# uwsgi --ini uwsgi.conf --http-socket :8001

uwsgi 配置文件:

[uwsgi]
#virtual env's base folder
base = /root/plaground
home = /usr/

#cmd options
bin = /usr/sbin/uwsgi

#python module to import
module = app:app

pythonpath = /root/playground

catch-exceptions = true

plugins-dir = /usr/lib64/uwsgi/
plugins = python

need-app = true

master = true
threads = 10

启动 uwsgi 后,对 /test 路由的第一个请求成功完成,第二个停留在命令行执行并永久保持响应。

第一次调用输出:

state 1
state 2
21 Sep 16:02:48 ntpdate[19943]: adjust time server 78.46.53.11 offset -0.000224 sec
state 3
output: None
error: None

第二次调用输出:

state 1
state 2

第二次调用后的 ps aux 输出:

# ps aux | grep ntpdate
root     20820  0.0  0.0  23632  1516 pts/3    S<+  16:03   0:00 ntpdate -u 0.pool.ntp.org

strace -p 20820 输出:

# strace -p 20820
strace: Process 20820 attached
restart_syscall(<... resuming interrupted call ...>) = 0 
poll([{fd=3, events=POLLIN}, {fd=4, events=POLLIN}], 2, 60000) = 0 (Timeout)
poll([{fd=3, events=POLLIN}, {fd=4, events=POLLIN}], 2, 60000) = 0 (Timeout)

进程 fd 列表:

# ls -l /proc/20820/fd
total 0
lr-x------ 1 root root 64 Eyl 21 16:05 0 -> /dev/null
lrwx------ 1 root root 64 Eyl 21 16:05 1 -> /dev/pts/3
lrwx------ 1 root root 64 Eyl 21 16:03 2 -> /dev/pts/3
lrwx------ 1 root root 64 Eyl 21 16:05 3 -> socket:[463358]
lrwx------ 1 root root 64 Eyl 21 16:05 4 -> socket:[463359]

lsof 输出:

# lsof -p 20820
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
ntpdate 20820 root  cwd    DIR  253,0       53 17726086 /root/playground
ntpdate 20820 root  rtd    DIR  253,0      244       64 /                                                                             
ntpdate 20820 root  txt    REG  253,0   110240   224413 /usr/sbin/ntpdate                                                             
ntpdate 20820 root  mem    REG  253,0   106848   361769 /usr/lib64/libresolv-2.17.so                                                  
ntpdate 20820 root  mem    REG  253,0    31824    31549 /usr/lib64/libnss_dns-2.17.so                                                 
ntpdate 20820 root  mem    REG  253,0    62184    31551 /usr/lib64/libnss_files-2.17.so                                               
ntpdate 20820 root  mem    REG  253,0    19896   142588 /usr/lib64/libattr.so.1.1.0                                                   
ntpdate 20820 root  mem    REG  253,0    90664   142317 /usr/lib64/libz.so.1.2.7                                                      
ntpdate 20820 root  mem    REG  253,0    19776    95386 /usr/lib64/libdl-2.17.so                                                      
ntpdate 20820 root  mem    REG  253,0  2173512    95380 /usr/lib64/libc-2.17.so                                                       
ntpdate 20820 root  mem    REG  253,0    20032   142590 /usr/lib64/libcap.so.2.22                                                     
ntpdate 20820 root  mem    REG  253,0  2512832   190324 /usr/lib64/libcrypto.so.1.0.2k                                                
ntpdate 20820 root  mem    REG  253,0   164240    95374 /usr/lib64/ld-2.17.so                                                         
ntpdate 20820 root    0r   CHR    1,3      0t0     5078 /dev/null                                                                     
ntpdate 20820 root    1u   CHR  136,3      0t0        6 /dev/pts/3                                                                    
ntpdate 20820 root    2u   CHR  136,3      0t0        6 /dev/pts/3                                                                    
ntpdate 20820 root    3u  sock    0,7      0t0   463358 protocol: UDP                                                                 
ntpdate 20820 root    4u  sock    0,7      0t0   463359 protocol: UDPv6 

如果我尝试使用 shell 或 flask 内置 Web 服务器的 ntpdate 命令,则不会发生此问题。我在 uwsgi github ( https://github.com/unbit/uwsgi/issues/1034 ) 页面上发现了类似的问题,但是这个修复并没有解决我的问题。

我还使用 uwsgi 参数 close-on-exec 和 close-on-exec2 进行了尝试。这些也没有运气。

感谢您的帮助。

标签: pythonmultithreadingflaskmultiprocessinguwsgi

解决方案


推荐阅读