【问题标题】:gunicorn returns same pid for different worker processgunicorn 为不同的工作进程返回相同的 pid
【发布时间】:2020-09-17 10:20:19
【问题描述】:

我试图更好地了解 gunicorn 如何管理其流程,因此我编写了以下代码:

from fastapi import FastAPI
import os
from time import sleep

app = FastAPI()
sleep_time = [5, 0]
global_var = 100
order_called = 0

@app.get('/test')
def test_handler(): 
    global global_var, order_called       
    order_called += 1
    local_order_called = order_called
    sleep(sleep_time[order_called - 1]) # doing some time consuming stuff here  
    global_var += 1
    return {"test": os.getpid(), "global_var": global_var, "order called": local_order_called}

我开始使用 gunicorn:

gunicorn -w 2 -k uvicorn.workers.UvicornWorker server:app --preload

对于两个连续的请求,服务器应该输出:pid, 102, 1 和 pid, 101, 2 - 因为工人 #1 需要更多时间才能完成。

我得到了正确的输出,但不知何故,返回的两个 pid 是相同的,这很奇怪 - 无论是否使用 --preload,都会发生这种情况。

任何人都可以对此有所了解吗?谢谢!

【问题讨论】:

    标签: python gunicorn fastapi uvicorn


    【解决方案1】:

    是什么让您认为服务器应该产生多个 PID?我在这里看不到任何会分叉另一个进程的东西。 os.getpid() 如果被服务器调用,每次都会返回相同的值。希望对您有所帮助!

    【讨论】:

    • 如果你有两个worker,这两个worker会同时处理两个请求。在这里我们有相同 pid 的原因是 - 我后来意识到 - uvicorn 使用异步工作器而不是同步工作器。
    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 2015-11-25
    • 1970-01-01
    • 2011-05-20
    • 2013-12-15
    • 1970-01-01
    • 2020-12-12
    相关资源
    最近更新 更多