账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    flask请求里用多进程的时候,可能会死锁是为什么?
    35
    0

    控制台输出能看到111111,但是后面就没了,看进程死锁了,而且不能稳定复现这个问题。10次出来1,2次吧

    def check(s,c):
        print(22222222222222)
        app = current_app._get_current_object()
        logger = current_app.logger
        ...
    
    class fix_service(Resource):
        def post(self, service_id):
            ...
            logger.info('fix: {name} done,start check'.format(name=service.name))
            # check
            with multiprocessing.Pool() as pool:
                print(111111111)
                check_results = pool.starmap(check, containers)
    
            logger.info('fix: check done')
            ...
    # ps -elf
    0 S root       6517   5322  0  80   0 - 50490 poll_s 10:54 ?        00:00:00 /usr/local/bin/python3.5 /usr/local/bin/gunicorn --threads 8 app:create_app("test") -b 0.0.0.0:18113 --access-lo
    1 S root       6520   6517  1  80   0 - 290893 ep_pol 10:54 ?       00:00:10 /usr/local/bin/python3.5 /usr/local/bin/gunicorn --threads 8 app:create_app("test") -b 0.0.0.0:18113 --access-lo
    1 S root       6730   6520  0  80   0 - 290690 futex_ 11:01 ?       00:00:00 /usr/local/bin/python3.5 /usr/local/bin/gunicorn --threads 8 app:create_app("test") -b 0.0.0.0:18113 --access-lo
    
    (gdb) bt
    #0  0x00007f99c0e31a00 in sem_wait () from /lib64/libpthread.so.0
    #1  0x00007f99b5950ff1 in semlock_acquire (self=0x7f99ace44688, args=<value optimized out>, kwds=<value optimized out>) at /opt/soft/Python-3.5.2/Modules/_multiprocessing/semaphore.c:307
    #2  0x00007f99c10fd961 in PyCFunction_Call (func=0x7f99ad2000d8, args=0x7f99c16ff048, kwds=<value optimized out>) at Objects/methodobject.c:98
    #3  0x00007f99c1184f25 in call_function (f=<value optimized out>, throwflag=<value optimized out>) at Python/ceval.c:4705
    #4  PyEval_EvalFrameEx (f=<value optimized out>, throwflag=<value optimized out>) at Python/ceval.c:3236
    #5  0x00007f99c1185e99 in _PyEval_EvalCodeWithName (_co=<value optimized out>, globals=<value optimized out>, locals=<value optimized out>, args=<value optimized out>, argcount=1, 
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 被你骗惯了 普通会员 1楼

      在 Flask 中,当请求在一个进程中被阻塞时,如果其他进程也在同一进程中,它们可能会进入死锁状态。这是因为这两个进程互相等待对方释放资源,导致它们都无法继续执行。要避免这种情况,可以使用 concurrent.futures 库中的 ThreadPoolExecutorProcessPoolExecutor。这两个类提供了异步执行和并发执行的功能,可以更好地处理多个请求。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部